web-dev-qa-db-ja.com

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

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

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

which Oracle | cd
cd < which Oracle

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

(もちろんコピー/貼り付けではなく)これを達成する方法はありますか?

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

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

編集:さて、それは私が最後に持っているものです:

cd `which Oracle | sed 's/\/Oracle//g'`
74
Michael Mao

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

そうではないcdコマンドを使用します。ディレクトリはコマンド引数です。そのような場合、コマンド置換を使用できます。 backticksまたは$(...)を使用してコマンドを評価し、変数に保存します。

_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)")"
_

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

105
mykhal

Dirnameを使用してディレクトリを取得します。

cd $(which Oracle | xargs dirname)

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

22
user180100
cd `which Oracle`

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

9
Cfreak

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

cd "$(dirname "$(which Oracle)")"

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

4
Philipp

パイプは必要ありません。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
2
bashfu

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

cd $(dirname `which Oracle`)
1
David Z

上記の良い答えに加えて、言及する必要があることの1つは、cdはシェル組み込みであり、lsこれはコマンドです。

  1. https://unix.stackexchange.com/questions/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd

  2. http://en.wikipedia.org/wiki/Shell_builtin

0
Jiacai Liu