Запустите программу из любого места без изменения каталога

Я хочу создать псевдоним, который запускает программу 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'
Другие вопросы по тегам