Запустите программу из любого места без изменения каталога
Я хочу создать псевдоним, который запускает программу x, без изменения текущего каталога, в котором я нахожусь. Теперь у меня есть:
alias x = "cd /home/path_to_x && ./x"
Это работает, но меняет мой каталог. Что я хочу сделать, это что-то вроде:
alias x="./home/path_to_x/x
Но тогда я не получаю такой файл или каталог. Кто-нибудь знает обходной путь для этого?
5 ответов
НЕ CD, просто запустите его, используя его абсолютный путь
Эта версия:
cd /home/path_to_x && ./x
меняет каталог на абсолютный путь (вы видите, как /home/...
начинается в корневом каталоге), а затем запускает исполняемый файл по относительному пути ./x
(то есть относительно нового рабочего каталога).
Эта версия:
./home/path_to_x/x
пытается запустить исполняемый файл по относительному пути ./home/path_to_x/x
, что означает, относительно вашего текущего рабочего каталога. Это объясняет, почему вы получаете ошибку - этот относительный путь действительно не существует.
Команда, которую вы хотите, будет:
/home/path_to_x/x
используя абсолютный путь (начиная с корневого каталога /
) снова.
О, и вы также можете просто добавить /home/path_to_x
на ваш PATH
вместо создания псевдонима. Смотрите: Как запускать скрипты без ввода полного пути?
Если вы не хотите cd
чтобы придерживаться псевдонима замены, используйте подоболочку с (
Y )
:
alias my_x="(cd /home/path_to_x && ./x)&"
Вы можете проверить это с
alias test_y="(cd /tmp && sleep 10 ) & "
Обратите внимание, что решение
alias my_y="/home/path_to_x/x"
не совсем эквивалентно. На самом деле, если вызывается через my_x
, x
программа запускается с текущей директорией /home/path_to_x/
в то время как если вызвано my_y
, x
запускается с текущим каталогом, в котором находится команда my_y
было выпущено. Это может быть важно или нет в зависимости от того, что x
делается.
О решении OP, оно работает в bash
:
romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano
но не в zsh
:
[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1] + 16744 done ./echo A > /dev/null
1& [romano:/bin] % pwd
/bin
[romano:/bin] %
Кажется, что bash и zsh выполняют списки по-разному... так что лучше добавить явные скобки... спасибо @EliahKagan за указание на меня.
Если файл, который вы хотите запустить, уже выполним, почему бы вам не добавить его в переменную PATH?
Если ваш исполняемый файл /home/user/aplication/appX
просто введите
PATH=$PATH:/home/user/application
на ваш ~/.bashrc
или же ~/.profile
После перезапуска консоли вы можете запустить ее просто с appX
Я думаю, что это самое чистое решение.
Положить &
в конце, кажется, делает трюк:
alias x = "cd /home/path_to_x && ./x &"
Получите резервную копию вашего текущего pwd и, после запуска команды, отмените ваш последний pwd.
alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'