Как запустить команду cd -
без вывода каких-либо выводов?
Я попытался cd - 2>&1 /dev/null
но это распечатывает каталог назначения.
Причина этого в том, что я хотел бы использовать функцию bash, и я бы предпочел, чтобы у меня не было ненужного вывода.
5 ответов
Попробуйте это так:
cd - > /dev/null
Вы также можете сделать:
cd - > uselessfile
Это отправит вывод в файл "uselessfile" вместо STDOUT.
Вы также можете добавить вместо создания или перезаписи файла.
cd - >> uselessfile
@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 - &>/dev/null
&>
- сокращенная версия cd - 2>/dev/null 1>&2
, которую, как я думаю, вы хотели использовать ...
- Примечание
&>
нужен bash> = 4.0.
Ps. большинство команд можно указать на местах, так что вряд ли вам на самом деле нужно cd
Ты можешь использовать:
cd ~-
Согласно справочной странице bash под Tilde Expansion
:
Если префикс тильды равен «~ -», значение переменной оболочки OLDPWD, если оно задано, подставляется.