Используйте «CD -» без вывода


28

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

Ответы:


32

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

cd - > /dev/null

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

cd - > uselessfile

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

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

cd - >> uselessfile

15

@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.


5

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

cd $OLDPWD

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

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


1
Если $OLDPWDне установлено, это заскочит вам ~. cd -выведет сообщение об ошибке (и, вероятно, оставит вас там, где вы уже были).
CVn

1
Вы не правы. Если $ OLDPWD не установлен (почему? Может быть, пользователь может сбросить это), 'cd -' будет иметь тот же результат, что и "cd $ OLDPWD". Проверьте страницу руководства («cd -» эквивалентно «cd« $ OLDPWD »&& pwd»). Или вы можете проверить это :) 'OLDPWD = ""; cd - '- видите, вы попадете в ~ и напечатаете символ ~.
uzsolt

1
Я только что проверил это. В моей системе последовательность cd /tmp bash cd -говорит bash: cd: OLDPWD not setна втором диске; тогда как последовательность cd /tmp bash cd $OLDPWDпереводит вас в ~ (почти наверняка, потому что $ OLDPWD раскрывается в пустую строку). cd $OLDPWDбудет работать нормально, если вы выполнили хотя бы одно cdв данной оболочке, но не раньше.
CVn

Хм, да, ты прав. Я проверил с Zsh и с Zsh не пропускает сообщение об ошибке.
uzsolt

1

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

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

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

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


0

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

cd ~-

Согласно странице руководства bash Tilde Expansion:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.