it-swarm-ru.tech

Выполнить определенную команду в данном каталоге, не обращаясь к нему?

Есть ли способ выполнить команду в другом каталоге без необходимости cd к ней? Я знаю, что могу просто cd войти и cd выйти, но меня просто интересуют возможности пропустить дополнительные шаги :)

43
Naftuli Kay

Я не знаю, считается ли это, но вы можете сделать подоболочку:

$ (cd /var/log && cp -- *.log ~/Desktop)

Каталог изменяется только для этой подоболочки, поэтому вам не нужно выполнять cd - потом.

56
Michael Mrozek

В некоторых программах есть опции, с помощью которых вы можете указать их chdir (2) самим себе (например, GNU tar s -C/--directory).

Однако вне таких программ что-то должно быть chdir . Вы могли бы написать и использовать какую-то скомпилированную "бинарную" программу вместо того, чтобы Shell это делала, но это, вероятно, не принесло бы большой пользы.

В комментарии к другому ответу вы привели пример:

execindirectory -d /var/log "cp *.log ~/Desktop"

Поскольку *.log шаблон расширяется самой Shell (не cp ), что-то придется chdir в каталог, прежде чем Shell оценит вашу команду.

Если вам просто интересно избегать "cd back", то вы можете использовать подоболочку, чтобы изолировать эффект cd от вашего рабочего экземпляра Shell ,.

(cd /path/to/dir && some command)

Вы можете упаковать это в функцию Shell. (Я бросил -d вариант из вашего примера использования, так как эта команда не имеет смысла, если каталог на самом деле является необязательным.)

runindir() { (cd "$1" && shift && eval "[email protected]"); }

runindir /var/log 'cp *.log ~/Desktop'  # your example
runindir /var/log cp \*.log \~/Desktop  # eval takes multiple args

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first
14
Chris Johnsen

Не для того, чтобы подорвать ценность ответов, данных другими людьми, но я верю в то, что вы хотите это:

(cd /path/to && ./executable [ARGS])

Обратите внимание на парены, чтобы вызвать cd в вложенной оболочке.

11
alex

Вот то, что должно позволить вам cd вернуться туда, где вы были (используя Bash), так как цель этого вопроса - не забыть сделать это:

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(Правка: немного короче версия, благодаря @ Random832)

4
Bruno

К сожалению, ваш пример:

execindirectory -d /var/log "cp *.log ~/Desktop"

не нужно менять каталог, потому что

cp /var/log/*.log ~/Desktop

сделал бы то же самое. Разве вы не можете приблизиться к своей реальной проблеме? Потому что мы могли бы также найти лучшее решение для этого.

Сложным способом решения вашей проблемы, который далек от элегантности решения Michaels, является использование команды find, которая имеет ключ '-execdir', который должен выполняться в директории, где находится файл. Плохо принят по вашему примеру:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

Может быть, это полезно для вашей реальной проблемы. -okdir вместо -execdir попросит вас подтвердить каждый вызов.

-okdir и -execdir, возможно, потребуется установить gnu-find, который обычно используется в Linux.

2
user unknown

Как насчет ./your/path/command.sh?

1
bdictator