Відповіді:
@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.
Можливо, ви можете використовувати
cd $OLDPWD
але в цьому випадку потрібно більше набирати :)
Але ви маєте перевагу: якщо виникне помилка, повідомлення не перенаправлятиметься в / dev / null.
cd /tmp bash cd - говорить bash: cd: OLDPWD not set на другому диску; тоді як послідовність cd /tmp bash cd $OLDPWD впадає в ~ (майже напевно, оскільки $ OLDPWD розширюється до порожнього рядка). cd $OLDPWD працюватиме добре, як тільки ви зробите хоча б один cd в межах оболонки, про яку йде мова, але не раніше.
Перенаправлення стандартного висновку та stderr: cd - &>/dev/null
&> є короткою версією cd - 2>/dev/null 1>&2, який я те, що я думаю, ви хотіли використовувати ...
&> потрібно bash & gt; = 4.0. Ps. Більшість команд можна вказати в місцях розташування, тому навряд чи потрібно cd
$OLDPWDвимкнено, це призведе до вимкнення~.cd -друкуватиме помилку (і, мабуть, залишить вас там, де ви вже були).