回答:
@erewokはすでに質問に回答しましたが、実際に何が起こっているのか、なぜあなたがしている行動を見ているのかを説明します。
問題はリダイレクトにあります。あなたが書いています:
cd - 2>&1 /dev/null
リダイレクトはコマンドライン内のどこにでも表示できるため(のような単純なもので確認できますecho a b 2>&1 c </etc/fstab d
)、リダイレクトが取り除かれた後、実際になります:
cd - /dev/null
問題が発生しましたか?cd
1つの引数と2つのリダイレクトではなく、2つの引数を渡しています。一度に1つのカレントディレクトリにcd
しかいられないため、最初の引数(この場合は)のみを考慮します-
。
あなたはおそらく意図した書き込みをすることはあるcd
の/ dev / nullにstderrのとstdoutの両方のリダイレクトを使用してコマンド。それを行うには2つの方法があります。
あなたのケースで最も簡単なのは、>
キャラクターを追加することで、単にリダイレクトしたいことをシェルに知らせることです。これが@erewokが提案していることです。
cd - 2>&1 >/dev/null
これは最初にstderr(ファイル記述子2)をファイル記述子1(stdout)にリダイレクトし、次にstdout(暗黙的な1)を/ dev / nullにリダイレクトします。順序が重要であることに注意してください。リダイレクトを逆にした場合、同じ結果は得られませんが、場合によっては、特定のプログラムがそれぞれの出力ストリームをどのように使用するかにより、そうするように見えることがあります。
または、@demureで提案されているように&>
、この構文がシェルでサポートされている場合、両方のストリームを一度にリダイレクトするために使用できます。
cd - &>/dev/null
$OLDPWD
標準エラー出力をシステムのブラックホールにリダイレクトしているため、これらの選択肢のいずれかが存在しなくなると、エラーが沈黙することに注意してください。これが懸念される場合は、$?
後で確認します。本当に心配な場合は、これを自分で確認する必要がありますが、少なくとも私のテストでは、成功した後に失敗したcd
(cd $someplace
またはcd -
)セットです。$? = 1
$? = 0
たぶんあなたは使うことができます
cd $OLDPWD
ただし、この場合、さらに入力する必要があります:)
ただし、利点があります。エラーがある場合、メッセージは/ dev / nullにリダイレクトされません。
cd /tmp
bash
cd -
が表示さbash: cd: OLDPWD not set
れます。一方、シーケンスcd /tmp
bash
cd $OLDPWD
は〜にドロップします(ほぼ確実に、$ OLDPWDは空の文字列に展開されるため)。問題のシェル内cd $OLDPWD
で少なくとも1つを行うとcd
問題なく動作しますが、それまでは動作しません。
$OLDPWD
が設定されていない場合、これはにドロップされます~
。cd -
エラーを出力します(そして、おそらくあなたが既にいた場所にあなたを残します)。