bash-whichコマンドからの結果をcdにパイプする方法


87

whichコマンドの結果をにパイプするにはどうすればよいcdですか?

これは私がやろうとしていることです:

which oracle | cd
cd < which oracle

しかし、それらのどれも機能しません。

これを実現する方法はありますか(もちろんコピー/貼り付けではありません)?

編集:考え直してみると、宛先ファイルはフォルダ/ディレクトリではないため、このコマンドは失敗します

だから私は今、末尾の「/ oracle」部分を取り除くためのより良い方法を考えて考えています(sedまたはawk、あるいはPerlさえ):)

編集:さて、それは私が最終的に得たものです:

cd `which oracle | sed 's/\/oracle//g'`

2
ディレクトリではなくコマンドを提供します
Anycorn 2010

プログラムがインストールされているディレクトリを取得しようとしていますか?dirnamebasename
Anycorn 2010

@aaa:その通りです。オラクルの実行可能ファイルへのシンボリックリンクではなく、「実際のdir」を指しているので、dirnameの方が優れていると思います...これが私のsedアプローチが失敗する理由です:)
Michael Mao

回答:


128

コマンドが標準入力からのパラメーターを期待する場合は、パイプを使用します。(これについての詳細)。

そうcdではないコマンドで。ディレクトリはコマンド引数です。このような場合、コマンド置換を使用できます。バッククォートを使用するか$(...)、コマンドを評価するには、変数に格納します。

path=`which oracle`
echo $path # just for debug
cd $path

それははるかに簡単な方法で行うことができますが:

cd `which oracle` 

またはパスに特殊文字が含まれている場合

cd "`which oracle`"

または

cd $(which oracle)

これはバッククォート表記と同等ですが、推奨されます(バッククォートはアポストロフィと混同される可能性があります)

..しかしそれはあなたが望むように見えます:

cd $(dirname $(which oracle))

(これは、ネストを簡単に使用できることを示しています)

$(...) (バックティックと同様に)二重引用符で囲まれた文字列でも機能します。これは、結果に最終的にスペースが含まれる可能性がある場合に役立ちます。

cd "$(dirname "$(which oracle)")"

(両方の出力には二重引用符のセットが必要であることに注意してください。)


涼しい。ここで何が起こっているのか、少し説明していただけますか?これは変数の逆参照のように見えます。コマンドの結果が入るデフォルトの一時変数はありますか?
ネイトW.

ああ、私はバックティックについての競争力を忘れていました:(
Michael Mao

4
別の引用符のペアが必要です:cd "$(dirname "$(which oracle)")"
フィリップ

|そうしても、新しいプロセスを開くcdSTDINから読み、cmd | cd考えていない仕事(すなわち元のプロセスの現在のディレクトリは同じままです)。
カイルストランド

23

ディレクトリを取得するためのdirname:

cd $(which oracle | xargs dirname)

編集:スペースを含むパスに注意してください。以下の@anishpatelコメントを参照してください。


2
cd "$(which oracle | xargs -0 dirname)"パスに空白が含まれている可能性がある場合に使用します。-0フラグは、入力を空白ではなくnullで分割します。
anishpatel 2017年

9
cd `which oracle`

これらはバックティックであることに注意してください(通常、米国のキーボードでは1の左側にあるキー)


1
パスにスペースやその他の「特殊」文字が含まれている場合、これは機能せず、ファイル名を削除する必要があります。
フィリップ

@Philippパスに特殊文字が含まれている場合は、これを使用できますcd "`which oracle`"
Ram Patra

4

OK、ここで正しい引用を使用するソリューション:

cd "$(dirname "$(which oracle)")"

バックティックは避けてください。読みにくく、常にプロセスの置換を引用します。


2

パイプは必要ありません。Bashパラメーター展開を使用して、やりたいことができます。

さらにヒント:Bashを使用している場合は、外部の「which」コマンドの代わりに「type-P」を使用してください。

# test
touch /ls
chmod +x /ls
cmd='ls'
PATH=/:$PATH
if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then
   cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; }
else
   echo "No such program in PATH search directories: ${cmd}"
   exit 1
fi

1

編集した質問に答えて、次のコマンドを使用してコマンドの名前を削除できますdirname

cd $(dirname `which oracle`)

パスにスペースやその他の「特殊」文字が含まれている場合、これは機能しません。
フィリップ

1
二重引用符で簡単に修正できます。
David Z

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.