@erewok ya respondió la pregunta , pero intentaré explicar qué está sucediendo realmente y por qué está viendo el comportamiento que hace.
El problema es con tu redirección. Estas escribiendo:
cd - 2>&1 /dev/null
que debido a que las redirecciones pueden aparecer en cualquier lugar dentro de la línea de comando (puede confirmarlo usted mismo con algo simple como echo a b 2>&1 c </etc/fstab d), después de que las redirecciones se eliminan, en realidad se convierte en:
cd - /dev/null
¿Ves el problema? Está pasando dos argumentos a cd, no un argumento y dos redirecciones. Como solo puede estar en un directorio actual a la vez, cdsolo considera su primer argumento, que en este caso es el -.
Lo que probablemente pretendía escribir es un cdcomando con redirección de stderr y stdout a / dev / null. Hay dos maneras de hacerlo.
Lo más fácil en su caso sería simplemente informar al shell que desea la redirección, agregando un >carácter. Esto es lo que sugiere @erewok.
cd - 2>&1 >/dev/null
Esto primero redirige stderr (descriptor de archivo 2) al descriptor de archivo 1 (stdout), luego redirige stdout (implícito 1) a / dev / null. Tenga en cuenta que el orden es importante; no obtendrá el mismo resultado si invierte las redirecciones, aunque en algunos casos puede parecer que lo hace debido a cómo el programa en particular usa los flujos de salida respectivos.
Alternativamente, como ha sugerido @demure , puede utilizar &>para redirigir ambas secuencias a la vez si su shell admite esta sintaxis.
cd - &>/dev/null
Tenga en cuenta que cualquiera de estas alternativas también silenciará el error cuando $OLDPWDya no exista, ya que está redirigiendo la salida de error estándar al agujero negro del sistema. Si esto es una preocupación, lo comprobaría $?después; debe confirmar esto usted mismo si es una preocupación real, pero al menos en mis pruebas, un error cd(si cd $someplaceo no cd -) se establece $? = 1después del éxito $? = 0.
$OLDPWDestá configurado, esto te dejará caer~.cd -imprimirá un error (y presumiblemente lo dejará donde ya estaba).cd /tmpbashcd -dicebash: cd: OLDPWD not seten el segundo CD; mientras que la secuenciacd /tmpbashcd $OLDPWDlo lleva a ~ (casi con certeza porque $ OLDPWD se expande a una cadena vacía).cd $OLDPWDfuncionará bien una vez que haya hecho al menos unocddentro del shell en cuestión, pero no antes.Redirigir stdout y stderr:
cd - &>/dev/nullesta
&>es la versión abreviada decd - 2>/dev/null 1>&2, que creo que querías usar ...&>necesita bash> = 4.0.PD. la mayoría de los comandos pueden apuntar a ubicaciones, por lo que es poco probable que realmente necesite
cdfuente
Puedes usar:
De acuerdo con la página de manual de bash debajo
Tilde Expansion:fuente