Utilice "cd -" sin ninguna salida


28

¿Cómo ejecuto el cd -comando sin hacer eco de ninguna salida?
Lo intenté cd - 2>&1 /dev/nullpero eso imprime el directorio de destino.
La razón de esto es que me gustaría usarlo como una función bash y preferiría no tener la salida innecesaria.

Respuestas:


32

Pruébalo así:

cd - > /dev/null

También puedes hacer:

cd - > uselessfile

Esto enviará la salida al archivo "archivo inútil" en lugar de a STDOUT.

También puede agregar en lugar de crear o sobrescribir el archivo.

cd - >> uselessfile

15

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


5

Tal vez puedas usar

cd $OLDPWD

pero en este caso necesitarás escribir más :)

Pero tendrá una ventaja: si hay algún error, el mensaje no se redirigirá a / dev / null.


1
Si no $OLDPWDestá configurado, esto te dejará caer ~. cd -imprimirá un error (y presumiblemente lo dejará donde ya estaba).
un CVn

1
No tienes razón. Si $ OLDPWD está desarmado (¿por qué? Tal vez el usuario puede desarmar esto), el 'cd -' tiene el mismo resultado que "cd $ OLDPWD". Consulte la página del manual ('cd -' es equivalente 'cd "$ OLDPWD" && pwd'). O puede probarlo :) 'OLDPWD = ""; cd - '- verás que caerás en ~ e imprimirás un ~ carácter.
uzsolt

1
Lo acabo de probar. En mi sistema, la secuencia cd /tmp bash cd -dice bash: cd: OLDPWD not seten el segundo CD; mientras que la secuencia cd /tmp bash cd $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 uno cddentro del shell en cuestión, pero no antes.
un CVn

Hm, sí, tienes razón. He probado con zsh y con zsh no deja caer el mensaje de error.
uzsolt

1

Redirigir stdout y stderr: cd - &>/dev/null

esta &>es la versión abreviada de cd - 2>/dev/null 1>&2, que creo que querías usar ...

  • La nota &>necesita bash> = 4.0.

PD. la mayoría de los comandos pueden apuntar a ubicaciones, por lo que es poco probable que realmente necesitecd


0

Puedes usar:

cd ~-

De acuerdo con la página de manual de bash debajo Tilde Expansion:

Si el prefijo tilde es un '~ -', el valor de la variable de shell OLDPWD, si está configurado, se sustituye.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.