Risposte:
@erewok ha già risposto alla domanda , ma mi prenderò cura di spiegare cosa sta realmente accadendo e perché stai vedendo il comportamento che fai.
Il problema è con il reindirizzamento. Stai scrivendo:
cd - 2>&1 /dev/null
che poiché i reindirizzamenti possono apparire ovunque all'interno della riga di comando (puoi confermarlo tu stesso con qualcosa di semplice come echo a b 2>&1 c </etc/fstab d), dopo che i reindirizzamenti vengono eliminati diventa effettivamente:
cd - /dev/null
Vedi il problema? Stai passando due argomenti a cd, non un argomento e due reindirizzamenti. Dato che puoi essere sempre e solo in una directory corrente alla volta, cdconsidera solo il suo primo argomento, che in questo caso è il -.
Quello che probabilmente intendevi scrivere è un cdcomando con reindirizzamento di stderr e stdout su / dev / null. Ci sono due modi per farlo.
Il più semplice nel tuo caso sarebbe semplicemente informare la shell che vuoi reindirizzare, aggiungendo un >carattere. Questo è ciò che suggerisce @erewok.
cd - 2>&1 >/dev/null
Questo prima reindirizza stderr (descrittore di file 2) nel descrittore di file 1 (stdout), quindi reindirizza stdout (implicito 1) in / dev / null. Si noti che l'ordinamento è importante; non otterrai lo stesso risultato se inverti i reindirizzamenti, anche se in alcuni casi può sembrare che lo fai a causa di come il particolare programma utilizza i rispettivi flussi di output.
In alternativa, come è stato suggerito da @demure , è possibile utilizzare &>per reindirizzare entrambi i flussi contemporaneamente se questa sintassi è supportata dalla shell.
cd - &>/dev/null
Si noti che una qualsiasi di queste alternative silenzia anche l'errore quando $OLDPWDnon esiste più, poiché si sta reindirizzando l'output di errore standard nel buco nero del sistema. Se questa è una preoccupazione, vorrei controllare in $?seguito; dovresti confermarlo tu stesso se è una vera preoccupazione, ma almeno nei miei test, un insuccesso cd(se cd $someplaceo cd -) imposta $? = 1dopo il successo $? = 0.
Forse puoi usare
cd $OLDPWD
ma in questo caso dovrai scrivere di più :)
Ma avrai un vantaggio: se c'è qualche errore il messaggio non reindirizzerà in / dev / null.
cd /tmp bash cd -dice bash: cd: OLDPWD not setal secondo cd; mentre la sequenza cd /tmp bash cd $OLDPWDti porta in ~ (quasi certamente perché $ OLDPWD si espande in una stringa vuota). cd $OLDPWDfunzionerà bene dopo averne eseguito almeno uno cdall'interno della shell in questione, ma non prima di allora.
Reindirizzare stdout e stderr:
cd - &>/dev/null
la &>è la versione a corto di mano cd - 2>/dev/null 1>&2, che io quello che penso si intende utilizzare ...
&>bisogno di bash> = 4.0.Ps. la maggior parte dei comandi può essere indirizzata verso posizioni, quindi è improbabile che tu debba effettivamente farlocd
$OLDPWDnon è impostato, questo ti farà entrare~.cd -stamperà un errore (e presumibilmente ti lascerà dove eri già).