Я хочу создать псевдоним, который запускает программу x, без изменения текущего каталога, в котором я нахожусь. Теперь у меня есть:
alias x = "cd /home/path_to_x && ./x"
Это работает, но меняет мой каталог. Что я хочу сделать, это что-то вроде:
alias x="./home/path_to_x/x
Но тогда я не получаю такой файл или каталог. Кто-нибудь знает обходной путь для этого?
command-line
alias
TheFisherman
источник
источник
alias x='/home/path_to_x/x'
. Не используйте.
раньше/home
..
(точка) относится к текущему каталогу.x
Действительно ли нужно бежать, находясь в/home/path_to_x
? Или вы просто не знаете, как запустить программу, находящуюся в определенном каталоге?Ответы:
НЕ CD, просто запустите его, используя его абсолютный путь
Эта версия:
изменяет каталог на абсолютный путь (вы видите, как он
/home/...
запускается в корневом каталоге), а затем запускает исполняемый файл по относительному пути./x
(то есть относительно нового рабочего каталога).Эта версия:
пытается запустить исполняемый файл по относительному пути
./home/path_to_x/x
, что означает относительно того, какой сейчас является ваш текущий рабочий каталог . Это объясняет, почему вы получаете ошибку - этот относительный путь действительно не существует.Команда, которую вы хотите, будет:
используя абсолютный путь (начиная с корневого каталога
/
) снова.О, и вы также можете просто добавить
/home/path_to_x
к своемуPATH
вместо создания псевдонима. Смотрите: Как запускать скрипты без ввода полного пути?источник
pwd
/home/path_to_x/x
функционально не эквивалентен(cd /home/path_to_x && ./x)
; работает ли он или нет, зависит от приложения.Если вы не хотите,
cd
чтобы после замены псевдонима вставлялось, используйте подоболочку с(
y)
:Вы можете проверить это с
Обратите внимание, что решение
не совсем эквивалентно. В самом деле, если вызывается через
my_x
, тоx
программа запускается с текущим каталогом/home/path_to_x/
, в то время как если вызываетсяmy_y
,x
выполняется с текущим каталогом , который является тот , в котором командаmy_y
была выдана. Это может быть важно или нет в зависимости от того, чтоx
делает.Что касается решения OP , оно работает в
bash
:но не в
zsh
:Кажется, что bash и zsh выполняют списки по-разному ... так что лучше добавить явные скобки ... спасибо @EliahKagan за указание его мне.
источник
&
более высокого приоритета, чем&&
кажется, может быть уникальнымzsh
. Я пыталсяsleep 5 && echo done &
вzsh
,bash
,ksh
,mksh
,dash
, и даже одна оболочка без Борна-стиль (tcsh
).zsh
Оценивается толькоsleep 5
на переднем плане; все остальные вернулись немедленно (затемdone
, конечно, через пять секунд). С другой стороны, даже если это полностью особенностьzsh
, я думаю, что добавление явного( )
(или{ ;}
) разумно, так как оно передает намерение другим людям (или себе, при чтении сценария или истории позже).Если файл, который вы хотите запустить, уже выполним, почему бы вам не добавить его в переменную PATH?
Если ваш исполняемый файл
/home/user/aplication/appX
просто введитек вашему
~/.bashrc
или~/.profile
После перезапуска консоли вы можете запустить ее просто с помощью
appX
Я думаю, что это самое чистое решение.
источник
Помещение
&
в конец, кажется, делает трюк:источник
x
вы находитесь в/home/path_to_x
. В&
конце просто отправьте процесс в фоновом режиме.cd
s в фоновых заданиях не влияют на абонента (что имеет смысл - было бы очень странно, если бы они это сделали). Это потому, что асинхронное выполнение использует подоболочку . Хотя было бы лучше, если бы он объяснил, почему это работает и что&
делает - и как запуск в фоновом режиме иногда нежелателен - это (уже) правильный ответ. ( Явное создание подоболочки с( )
синтаксисом, как вы предлагаете , вероятно, в большинстве случаев является лучшим решением.)zsh
и эффективно оно работает,bash
а не вzsh
... должно быть какая-то разница в том, как расширены псевдонимы.pushd
inzsh
(у меня естьsetopt autopushd pushdsilent pushdtohome
, и он помнит мой cwd.)Получите резервную копию вашего текущего pwd и после запуска вашей команды отмените ваш последний pwd.
источник
test
) переместил курсор на следующую строку. Вы по-прежнему можете делать там все, что хотите (включая нажатие клавиши Enter, чтобы открыть новое новое приглашение).pushd
иpopd
делай то, что делает твой ответ.alias x='pushd /home/path_to_x && ./x && popd'