web-dev-qa-db-ja.com

cdせずに、特定のディレクトリで特定のコマンドを実行しますか?

cdを実行せずに別のディレクトリでコマンドを実行する方法はありますか?私は単にcd inとcd outができることを知っていますが、私は追加のステップを忘れる可能性に興味があります:)

43
Naftuli Kay

これが重要かどうかはわかりませんが、サブシェルを作成できます。

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

ディレクトリはそのサブシェルに対してのみ変更されるため、後でcd -を実行する必要がないようにする必要があります。

56
Michael Mrozek

一部のプログラムには、 chdir(2) 自体を指定できるオプションがあります(例GNUtar-C/--directory)。

ただし、そのようなプログラム以外では、何かがchdirになります。シェルにそれを実行させる代わりに、ある種のコンパイルされた「バイナリ」プログラムを作成して使用することもできますが、おそらくあまりメリットはありません。

別の回答のコメントで、例を挙げました:

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

*.logパターンはシェル自体によって展開されます(cpではありません)。何かがchdirシェルがコマンドを評価する前にディレクトリに。

「cd back」の必要を回避することに興味がある場合は、サブシェルを使用して、cdの影響を作業中のShellインスタンスから分離できます。 。

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

これをシェル関数にパッケージ化できます。 (私は-dオプションは、ディレクトリが実際にオプションである場合、このコマンドにはほとんど意味がないため、使用例から。

runindir() { (cd "$1" && shift && eval "$@"); }

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

これは、([bvar]を使用して)元の場所にcdを戻すことができるはずです。そうすることを忘れないことが質問の目的のようです。

# 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"

dirを変更する必要はありません。

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

同じことをします。あなたはあなたの本当の問題に近づくことができませんか?私たちもそのためのより良いソリューションを知っているかもしれないからです。

Michaelsソリューションの優雅さから遠く離れている、問題を解決するための複雑な方法は、findの使用です。これには、ファイルが見つかったdirで実行されるスイッチ '-execdir'があります。あなたの例にひどく採用されました:

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

多分それはあなたの本当の問題に役立つでしょう。 -execdirではなく-okdirを指定すると、すべての呼び出しを確認するように求められます。

-okdirと-execdirには、通常Linuxで使用されるgnu-findのインストールが必要になる場合があります。

2
user unknown

./your/path/command.sh

1
bdictator