26

Как запустить команду cd - без вывода каких-либо выводов?
Я попытался cd - 2>&1 /dev/null но это распечатывает каталог назначения.
Причина этого в том, что я хотел бы использовать функцию bash, и я бы предпочел, чтобы у меня не было ненужного вывода.

5 ответов5

29

Попробуйте это так:

cd - > /dev/null

Вы также можете сделать:

cd - > uselessfile

Это отправит вывод в файл "uselessfile" вместо STDOUT.

Вы также можете добавить вместо создания или перезаписи файла.

cd - >> uselessfile
13

@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

4

Может быть, вы можете использовать

cd $OLDPWD

но в этом случае вам нужно больше печатать :)

Но у вас будет преимущество: в случае ошибки сообщение не будет перенаправлено в /dev /null.

1

Перенаправить стандартный вывод и стандартный вывод:cd - &>/dev/null

&> - сокращенная версия cd - 2>/dev/null 1>&2 , которую, как я думаю, вы хотели использовать ...

  • Примечание &> нужен bash> = 4.0.

Ps. большинство команд можно указать на местах, так что вряд ли вам на самом деле нужно cd

0

Ты можешь использовать:

cd ~-

Согласно справочной странице bash под Tilde Expansion:

Если префикс тильды равен «~ -», значение переменной оболочки OLDPWD, если оно задано, подставляется.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .