cd
を実行せずに別のディレクトリでコマンドを実行する方法はありますか?私は単にcd
inとcd
outができることを知っていますが、私は追加のステップを忘れる可能性に興味があります:)
これが重要かどうかはわかりませんが、サブシェルを作成できます。
$ (cd /var/log && cp -- *.log ~/Desktop)
ディレクトリはそのサブシェルに対してのみ変更されるため、後でcd -
を実行する必要がないようにする必要があります。
一部のプログラムには、 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
他の人からの回答の価値を損なうものではありませんが、私はあなたが望んでいるものを信じていますこれは:
(cd /path/to && ./executable [ARGS])
括弧がサブシェルでcd
を呼び出すことに注意してください。
これは、([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のおかげで少し短いバージョン)
悲しいことに、あなたの例:
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のインストールが必要になる場合があります。
./your/path/command.sh
?