99

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

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

which oracle | cd
cd < which oracle

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

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

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

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

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

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

7 に答える 7

147

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

そうで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)")"

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

于 2010-08-09T05:25:09.970 に答える
26

ディレクトリを取得する dirname を使用:

cd $(which oracle | xargs dirname)

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

于 2010-08-09T05:38:42.823 に答える
10
cd `which oracle`

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

于 2010-08-09T05:25:42.470 に答える
4

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

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

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

于 2010-08-09T11:07:39.777 に答える
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
于 2010-08-09T10:56:01.610 に答える
1

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

cd $(dirname `which oracle`)
于 2010-08-09T05:37:56.467 に答える