Ответы:
@erewok уже ответил на вопрос , но я постараюсь объяснить, что на самом деле происходит и почему вы видите поведение, которое вы делаете.
Проблема в вашем перенаправлении. Вы пишете:
cd - 2>&1 /dev/null
что из-за того, что перенаправления могут появляться в любом месте командной строки (вы можете сами подтвердить это чем-то простым, например echo a b 2>&1 c </etc/fstab d), после удаления перенаправлений фактически становится:
cd - /dev/null
Видишь проблему? Вы передаете два аргумента cd, а не один аргумент и два перенаправления. Поскольку вы можете когда-либо находиться только в одном текущем каталоге за раз, cdучитывает только его первый аргумент, который в данном случае является -.
Вероятно, вы намеревались написать cdкоманду с перенаправлением как stderr, так и stdout в / dev / null. Есть два способа сделать это.
В вашем случае проще всего было бы просто сообщить оболочке, что вы хотите перенаправить, добавив >символ. Это то, что предлагает @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будет работать нормально, если вы выполнили хотя бы одно cdв данной оболочке, но не раньше.
Перенаправить стандартный вывод и стандартный вывод:
cd - &>/dev/null
&>является короткая версия рука cd - 2>/dev/null 1>&2, которую я , что я думаю , что вы имели в виду использовать ...
&>требует bash> = 4.0.Ps. большинство команд можно указывать в определенных местах, поэтому вряд ли вамcd
$OLDPWDне установлено, это заскочит вам~.cd -выведет сообщение об ошибке (и, вероятно, оставит вас там, где вы уже были).