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


42

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


これを行うスクリプトを作成するのはかなり簡単ですecho "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory。などのオプション「タグ」を実際にサポートしたい場合は、もう少し努力する必要があります-d
ローレンス

回答の中でユーザーが不明な状態であるため、ここおよびコメントで示したすべての例は他のソリューションでより適切に対処されるため、実際にここで解決する必要がある問題があるかどうかは不明です。より良い例を思いつくことができますか?
カレブ

回答:


55

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

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

ディレクトリはそのサブシェルに対してのみ変更されるため、cd -後で必要になる作業を回避できます。


2
それは私が通常行うことです。
アダムByrtek

いいですね、サブシェルについてはすべて忘れていましたが、この場合は非常に便利です。
ナフトゥリケイ

4
潜在的な混乱を避けるために、セミコロンを2つのアンパサンドでサブアウトします$ (cd /var/log && cp *.log ~/Desktop)。そのようにして、ディレクトリが存在しない場合、それ以上のコマンドは実行されません。
ナフトゥリケイ

私と同じくらい素朴な人への注意:開始時の$はコマンドの一部ではなく、それ以降のすべてです。
マルトロニック

14

一部のプログラムには、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

2
個人的に私はpushd / popdを使用することを除いて、このソリューションが好きです
ニュージャージー州

10

他の人から与えられた答えの価値を損なうものではありませんが、あなたが望むのはこれだと思います

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

サブシェルで呼び出す括弧に注意してくださいcd


そうは思いません。私が理解しているように、彼は最初のディレクトリに行きたがっています。
アダムByrtek

ああ、私はそれをサブシェルにラップするのを完全に忘れていました。私の答えを修正しました、ありがとう。
アレックス

4

ここであなたを聞かせなければならない何かである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のおかげでわずかに短いバージョン)


1
できませんpushd other-dir、ただpushd .; cd other-dir
ランダム832

@ Random832、良い点!
ブルーノ

2

悲しいことに、あなたの例:

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で使用されます。


1

どう./your/path/command.sh


いいえ、実際には次のようなものを意味しましたexecindirectory -d /var/log "cp *.log ~/Desktop"
ナフトゥリケイ

私はこれが厳密に必要ではないことを完全に承知しています。ところで、実際にそれができるかどうかだけに興味があります。
ナフトゥリケイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.