回答:
これが重要かどうかはわかりませんが、サブシェルを作成できます。
$ (cd /var/log && cp -- *.log ~/Desktop)
ディレクトリはそのサブシェルに対してのみ変更されるため、cd -
後で必要になる作業を回避できます。
$ (cd /var/log && cp *.log ~/Desktop)
。そのようにして、ディレクトリが存在しない場合、それ以上のコマンドは実行されません。
一部のプログラムには、chdir(2)自体に指示できるオプションがあります(GNU tarの-C
/など--directory
)。
ただし、そのようなプログラムの外では、何かがchdirする必要があります。シェルに実行させる代わりに、何らかのコンパイル済みの「バイナリ」プログラムを作成して使用することもできますが、おそらくあまりメリットはありません。
別の答えのコメントで、例を挙げました:
execindirectory -d /var/log "cp *.log ~/Desktop"
以来*.log
パターンはシェル自体(しないことによって展開されているCP)、何かがなければならないでしょうchdirし殻を持つ前に、ディレクトリにコマンドを評価します。
「cd back」の必要性を避けたい場合は、サブシェルを使用して、作業中のシェルインスタンスからcdの効果を分離できます。
(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
あなたが(バッシュを使用)し、どこバックは、そうすることを忘れてはならないので、質問の目的のようです:
# 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のおかげでわずかに短いバージョン)
pushd other-dir
、ただpushd .; cd other-dir
悲しいことに、あなたの例:
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のインストールにはgnu-findが必要になる場合があります。これは通常Linuxで使用されます。
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
。などのオプション「タグ」を実際にサポートしたい場合は、もう少し努力する必要があります-d
。