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

9

Я хочу создать псевдоним, который запускает программу x, без изменения текущего каталога, в котором я нахожусь. Теперь у меня есть:

alias x = "cd /home/path_to_x && ./x"

Это работает, но меняет мой каталог. Что я хочу сделать, это что-то вроде:

alias x="./home/path_to_x/x

Но тогда я не получаю такой файл или каталог. Кто-нибудь знает обходной путь для этого?

TheFisherman
источник
9
установить псевдоним как alias x='/home/path_to_x/x'. Не используйте .раньше /home. .(точка) относится к текущему каталогу.
Souravc
2
xДействительно ли нужно бежать, находясь в /home/path_to_x? Или вы просто не знаете, как запустить программу, находящуюся в определенном каталоге?
Adaephon
Еще один похожий вопрос askubuntu.com/questions/427818/…
c0rp

Ответы:

13

НЕ 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вместо создания псевдонима. Смотрите: Как запускать скрипты без ввода полного пути?

Бесполезный
источник
Это правильный ответ на поставленный вопрос.
Приостановлено до дальнейшего уведомления.
1
Это было бы неправильно только в том случае, если программу нужно было запустить в определенном каталоге, из которого она получалаpwd
Kaz Wolfe
@ Whaaaaaat прав. /home/path_to_x/xфункционально не эквивалентен (cd /home/path_to_x && ./x); работает ли он или нет, зависит от приложения.
Rmano
Хотя в целом вы правы, для этого конкретного вопроса OP явно пытался бежать с абсолютного пути (только с ошибкой в ​​один символ). Однако я уверен, что они могут уточнить, важен ли в этом случае рабочий каталог.
бесполезно
8

Если вы не хотите, 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 за указание его мне.

Rmano
источник
1
Предоставление &более высокого приоритета, чем &&кажется, может быть уникальным zsh. Я пытался sleep 5 && echo done &в zsh, bash, ksh, mksh, dash, и даже одна оболочка без Борна-стиль ( tcsh). zshОценивается только sleep 5на переднем плане; все остальные вернулись немедленно (затем done, конечно, через пять секунд). С другой стороны, даже если это полностью особенность zsh, я думаю, что добавление явного ( )(или { ;}) разумно, так как оно передает намерение другим людям (или себе, при чтении сценария или истории позже).
Элия ​​Каган,
4

Если файл, который вы хотите запустить, уже выполним, почему бы вам не добавить его в переменную PATH?

Если ваш исполняемый файл /home/user/aplication/appXпросто введите

PATH=$PATH:/home/user/application

к вашему ~/.bashrcили~/.profile

После перезапуска консоли вы можете запустить ее просто с помощью appX

Я думаю, что это самое чистое решение.

0xAffe
источник
3

Помещение &в конец, кажется, делает трюк:

alias x = "cd /home/path_to_x && ./x &"
TheFisherman
источник
2
Ты уверен? После выполнения xвы находитесь в /home/path_to_x. В &конце просто отправьте процесс в фоновом режиме.
Rmano
2
@Rmano Это на самом деле работает. cds в фоновых заданиях не влияют на абонента (что имеет смысл - было бы очень странно, если бы они это сделали). Это потому, что асинхронное выполнение использует подоболочку . Хотя было бы лучше, если бы он объяснил, почему это работает и что &делает - и как запуск в фоновом режиме иногда нежелателен - это (уже) правильный ответ. ( Явное создание подоболочки с ( )синтаксисом, как вы предлагаете , вероятно, в большинстве случаев является лучшим решением.)
Элия ​​Каган
@EliahKagan ты прав. Я проверил решение с zshи эффективно оно работает, bashа не в zsh... должно быть какая-то разница в том, как расширены псевдонимы.
Rmano
Задал
Rmano
@Rmano ты включил настройки, связанные с pushdin zsh(у меня есть setopt autopushd pushdsilent pushdtohome, и он помнит мой cwd.)
muru
0

Получите резервную копию вашего текущего pwd и после запуска вашей команды отмените ваш последний pwd.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'
αғsнιη
источник
Вы неправильно поняли эффект псевдонима этого Rmano. Командная строка не заблокирована. Просто вывод alias ( test) переместил курсор на следующую строку. Вы по-прежнему можете делать там все, что хотите (включая нажатие клавиши Enter, чтобы открыть новое новое приглашение).
Муру
да, да правильно. @mure: |
αғsнιη
Обратите внимание, что поскольку вы используете двойные кавычки, переменная будет включать текущий каталог во время определения псевдонима . Используйте одинарные кавычки, чтобы отложить оценку, пока псевдоним не будет расширен. Однако pushdи popdделай то, что делает твой ответ. alias x='pushd /home/path_to_x && ./x && popd'
Приостановлено до дальнейшего уведомления.