Ответы:
@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 -
выведет сообщение об ошибке (и, вероятно, оставит вас там, где вы уже были).