1

Я хочу добавить файл псевдонимов в папку моего проекта, чтобы быстро открывать и редактировать файлы в ней с помощью простой команды оболочки.
Чтобы сделать его более переносимым, я хотел бы использовать только относительные пути.
Я хочу что-то вроде этого:

### .profile

source /my/project/folder/aliases.bash

а также

### aliases.bash

alias editprojectfiles="edit [/my/project/folder/]afile.txt"

Теперь для меня проблема в том, как автоматически получить [/my/project/folder/] . Я пытался использовать переменную $PWD , но в результате псевдоним указывает на папку файла .profile а не на aliases.bash . Есть ли способ получить это?

ОБНОВИТЬ

Некоторые пользователи указывают мне на решение $PWD .
Это не работает, поскольку переменная $PWD относится к пути source команды, а не к проектной.
Так что я делаю это

### .profile

$~/>source /my/project/folder/aliases.bash

### aliases.bash

alias editprojectfiles="edit $PWD/afile.txt"

Создаст псевдоним, как это

editprojectfiles="edit /my/user/home/folder/afile.txt"

И делает это

### Call source from folder /foo/bar

$/foo/bar>source /my/project/folder/aliases.bash

### aliases.bash

alias editprojectfiles="edit $PWD/afile.txt"

Создаст псевдоним, как это

editprojectfiles="edit /foo/bar/afile.txt"

2 ответа2

3

Используйте одинарные кавычки:

alias editprojectfiles='edit $PWD/afile.txt'

Еще лучше, используйте это, если у вас есть пробел в имени каталога:

alias editprojectfiles='edit "$PWD"/afile.txt'

РЕДАКТИРОВАТЬ:

Прочитав ваши комментарии к ответу Саванто, я думаю, что вы хотите получить следующее:

  • у вас есть afile.txt в папке вашего текущего проекта
  • Вы редактируете этот файл
  • вы переходите к другому проекту и mv afile.txt в новую папку проекта
  • Вы все еще хотите отредактировать afile.txt в новой папке проекта

В основном вы хотите редактировать один и тот же файл afile.txt независимо от его местоположения. Каждый файл в файловой системе неоднозначно идентифицируется номером индекса. Вы можете увидеть номер индекса рядом с именем файла, используя ключ -i в команде ls:

$ ls -Alhi
total 4.0K
8013300 -rw-r--r-- 2 ja ja 10 Jun  3 11:38 afile.txt

Здесь 8013300 - номер индекса. После перемещения файла в другое место в пределах той же файловой системы его номер инода не изменяется. Теперь вам нужно создать жесткую ссылку, указывающую на afile.txt. Жесткие ссылки отличаются от символических ссылок. Жесткая ссылка имеет тот же номер инода, что и целевой файл. И, как я уже сказал, inode файла остается неизменным, даже если файл перемещен, так что даже если вы переместите оригинальный afile.txt в новый каталог, жесткая ссылка все равно будет указывать на файл в новом каталоге.

Используйте команду ln для создания жесткой ссылки:

$ ln path/to/afile afile

Если вы сделали это в своем домашнем каталоге, файл будет создан и будет иметь тот же индекс, что и путь / к / файлу. Попробуйте отредактировать ~ / afile и проверьте, изменился ли путь / к / afile. Попробуйте переместить path / to / afile в другой каталог, отредактируйте ~ / afile и снова проверьте, выглядит ли файл в новом месте так же, как и должен.

Если это работает для вас, сделайте ваш псевдоним следующим образом:

alias editprojectfiles="edit ~/afile.txt"

РЕДАКТИРОВАТЬ:

Я не думаю, что есть способ сделать это, используя только команду псевдонима в ~/project/aliases.bash. Вам нужно передать переменную команде псевдонимов, которая установлена перед командой псевдонимов. В вашем случае, эта переменная - это путь к alias.bash. Ваш aliases.bash должен выглядеть так:

DIR="$(dirname ${BASH_SOURCE[0]})";
alias editprojectfiles="edit $DIR/afile.txt"

$ DIR - это путь к папке вашего проекта. Последующие вызовы editprojectfiles будут ссылаться на каталог $ DIR, который всегда будет одинаковым.

0

Вы можете искать файл каждый раз, когда пытаетесь получить к нему доступ. Используя locate если он у вас есть:

alias editprojectfiles='edit "$(locate -n 1 "afile.txt")"'

Примечание: -n ограничивает результаты. В некоторых системах это -l вместо. Смотрите страницу locate вашего man.

Примечание: locate использует базу данных, которая периодически обновляется, но не всегда обновляется. Частота обновления зависит от вашей системы. Если вам нужны самые последние местоположения файлов, используйте find .


Несколько медленнее (но, возможно, более универсальным?) это использовать find:

alias editprojectfiles='edit "$(find ~ -name "afile.txt" -print -quit)"'

Вы могли бы сделать это быстрее, сузив диапазон поиска, указав более конкретную информацию, чем ~ для корневого каталога, или контролируя глубину.

альтернативно

Чтобы запретить поиск при каждом использовании вашего псевдонима, вы можете выполнить поиск один раз при входе в систему, и он будет выполняться в течение всего сеанса. Для этого в файле псевдонимов используйте locate или find и назначьте его переменной, а затем используйте эту переменную в псевдониме:

AFILE="$(find ~ -name "afile.txt" -print -quit)"
alias editprojectfiles="edit \"$AFILE\""

Примечание: двойные кавычки для расширения переменной.

Это, однако, не будет отслеживать файл, если вы переместите его в течение сеанса. Но если вы начнете новый сеанс, новое местоположение будет обновлено.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .