Використовуйте “cd -” без будь-якого виводу


26

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

Відповіді:


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 Розглядає тільки свій перший аргумент, який в даному випадку є -.

Що ви, напевно, призначений щоб написати це a cd команда з перенаправленням як stderr, так і stdout в / dev / null. Є два способи зробити це.

Найпростішим у вашому випадку буде просто інформувати оболонку, яку ви хочете перенаправити, додавши a > характер. Це те, що пропонує @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.


Якщо $OLDPWD вимкнено, це призведе до вимкнення ~. cd - друкуватиме помилку (і, мабуть, залишить вас там, де ви вже були).
a CVn

1
Ви не маєте права. Якщо $ OLDPWD не встановлено (чому? Можливо, користувач може вимкнути цей параметр), "cd -" має той же результат, що і "cd $ OLDPWD". Перевірте сторінку вручну ("cd -" є еквівалентом "cd" $ OLDPWD "& amp; & amp; pwd"). Або ви можете перевірити його :) 'OLDPWD = ""; cd - '- побачити, що ви впустите ~ і надрукуйте символ ~.
uzsolt

Я тільки що перевірив його. На моїй системі послідовність cd /tmp bash cd - говорить bash: cd: OLDPWD not set на другому диску; тоді як послідовність cd /tmp bash cd $OLDPWD впадає в ~ (майже напевно, оскільки $ OLDPWD розширюється до порожнього рядка). cd $OLDPWD працюватиме добре, як тільки ви зробите хоча б один cd в межах оболонки, про яку йде мова, але не раніше.
a CVn

Хм, так, ви праві. Я тестував з zsh і з zsh не випускає повідомлення про помилку.
uzsolt

1

Перенаправлення стандартного висновку та stderr: cd - &>/dev/null

&> є короткою версією cd - 2>/dev/null 1>&2, який я те, що я думаю, ви хотіли використовувати ...

  • Примітка &> потрібно bash & gt; = 4.0.

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


0

Можна використовувати:

cd ~-

Відповідно до сторінки bash man Tilde Expansion:

Якщо тильда-префікс є `~ - ', значення змінної оболонки OLDPWD, якщо воно встановлено, замінюється.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.