Запускайте програму з будь-якого місця, не змінюючи каталог


9

Я хочу створити псевдонім, який запускає програму x, не змінюючи поточний каталог, в якому я перебуваю.

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

Це працює, але міняє мій каталог. Я хочу зробити щось на зразок:

alias x="./home/path_to_x/x

Але тоді я не отримую такого файлу чи каталогу. Хтось знає вирішення цього питання?


9
встановити псевдонім, як alias x='/home/path_to_x/x'. Не використовуйте .раніше /home. .(крапка) посилається на поточний каталог.
souravc

2
Чи xсправді потрібно бігати під час перебування /home/path_to_x? Або ви просто не впевнені, як запустити програму, що знаходиться в певному каталозі?
Адаефон


Ще одне подібне запитання 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); якщо він працює чи ні, це залежить від програми.
Рмано

Хоча ти маєш рацію в цілому, для цього конкретного питання ОП помітно намагався бігти з абсолютного шляху (просто з односимвольною помилкою). Однак я впевнений, що вони можуть уточнити, чи важливий робочий каталог у цьому випадку.
Марно

8

Якщо ви не хочете, cdщоб прикріплення залишалося після підстановки псевдоніму, використовуйте нижню оболонку з (у ):

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робиш.

Щодо рішення ОП , воно працює в 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 за вказівку на мене.


1
Надання останнього &більш високого пріоритету, ніж &&здається, це може бути унікальним zsh. Я намагався sleep 5 && echo done &в zsh, bash, ksh, mksh, dash, і навіть одна оболонка без Борна-стиль ( tcsh). Тільки zshоцінюється sleep 5на передньому плані; всі інші повернулися негайно (потім done, звичайно, також надрукувались через п’ять секунд). З іншого боку, навіть якщо це цілком особливість zsh, я вважаю, що додавання явного ( )(або { ;}) є розумним, оскільки воно передає наміри іншим людям (або собі, коли читаєш сценарій чи історію пізніше).
Eliah Kagan

4

Якщо файл, який ви хочете запустити, вже виконується, чому б вам не додати його до змінної PATH?

Якщо ваш виконуваний файл /home/user/aplication/appXпросто введіть

PATH=$PATH:/home/user/application

на ваш ~/.bashrcабо~/.profile

Після перезавантаження вашої консолі її можна просто запустити appX

Я думаю, що це найчистіше рішення.


3

Поставити &кінець в кінці, здається, зробить трюк:

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

2
Ти впевнений? Після виконання xви знаходитесь у /home/path_to_x. &В кінці просто відправити процес у фоновому режимі.
Рмано

2
@Rmano Це насправді працює. cdЗавдання у фоновому режимі не впливають на абонента (що має сенс - було б справді дивно, якби вони були). Це тому, що в асинхронному виконанні використовується піддіаграма . Хоча це було б краще, якби це пояснило, чому це працює, і що &робить - а як працювати у фоновому режимі іноді небажано - це (вже) правильна відповідь. ( Очевидно, що підказка з ( )синтаксисом, як ви пропонуєте , - мабуть, краще рішення більшість часу.)
Елія Каган

@EliahKagan ви праві. Я перевірив рішення zshі ефективно він працює в, bashа не в zsh... повинно бути певна різниця в тому, як псевдоніми розгортаються.
Рмано


@Rmano ти включив налаштування, пов'язані з pushdв zsh(у мене є setopt autopushd pushdsilent pushdtohome, і він пам’ятає мій cwd.)
muru

0

Отримайте резервну копію поточного pwd і після запуску команди скасуйте останній pwd.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'

Ви неправильно зрозуміли ефект псевдоніма цього Рмано. Командний рядок не заблокований. Просто виведення псевдоніма ( test) підштовхнуло курсор до наступного рядка. Ви все одно можете там робити все, що завгодно (включаючи натискання клавіші Enter, щоб відкрити нове нове запит).
муру

так, правильно. @mure: |
αғsnιη

Зауважте, що оскільки ви використовуєте подвійні лапки, змінна буде включати поточний каталог у момент визначення псевдоніма . Використовуйте одинарні лапки, щоб відкласти оцінку, поки псевдонім не розшириться. Однак pushdі popdробіть те, що робить ваша відповідь. alias x='pushd /home/path_to_x && ./x && popd'
Призупинено до подальшого повідомлення.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.