¿Tiene cd. tener uso?


102

Uno de los tutoriales que he seguido brevemente declaró que cd .no tiene ningún uso. Al intentar replicar el problema que muestra OP en la recursividad de enlace simbólico, ¿qué lo hace "restablecer"? , También lo intenté cd ., que mostró el mismo efecto que describió OP ( $PWDvariable de crecimiento ), con el que se puede contrarrestar cd -P.

Esto me hace preguntarme, ¿hay algún caso en el que uno realmente quiera usar cd . ?


20
Tengo un .zshrc personalizado que ejecuta varias comprobaciones en el directorio al cambiar de directorio, por ejemplo, una de las comprobaciones es activar / desactivar automáticamente un virtualenv coincidente al mover directorios. De vez en cuando, podría comenzar un nuevo shell o lo que sea, y esas comprobaciones no se ejecutan, y generalmente uso cd .para activar esas comprobaciones porque es breve y simple. Aunque creo que pretendías que la pregunta fuera para un ambiente vainilla.
Mentira Ryan

29
Además del efecto (obvio) en $PWD, cd .también cambia $OLDPWDal directorio actual. (Actualmente) no tengo idea de por qué esto podría ser útil, pero en aras de la integridad ...
Andreas Wiese

55
No creo que lo haya necesitado nunca cd ., aunque al ver las respuestas a continuación, podría hacerlo en el futuro, pero en ocasiones lo he usado pushd .cuando quería poder popdvolver a este directorio más tarde. por ejemplo, cuando ejecute un script de compilación que lo haga configure, cd output...y make, cuando esté hecho, querré volver al directorio original. En lugar de mantener mi propia copia del buildscript que es diferente de lo que todos los demás esperan, simplemente lo ejecuto como pushd .; ./BuildScriptName.sh; popd, y esto también me da la libertad de no hacerlo popdalgunas veces, y luego popdmás tarde.
3D1T0R

55
Sin mencionar, por supuesto, que '.' y '...' no se implementan en el comando cd en sí, por lo que nadie se propuso hacer esa característica específica, es solo una combinación de cosas que no tiene ningún propósito real.
David S

1
@ruakh No, los programas externos no deberían afectar el entorno de ejecución de shell. Es principalmente para el cumplimiento de POSIX que requiere que algunas de las utilidades existan fuera del shell y evaluar el estado de salida de los comandos externos. Puede leer sobre el propósito de /bin/cdaquí unix.stackexchange.com/q/50058/85039
Sergiy Kolodyazhnyy

Respuestas:


158

Creo que esto es pensar demasiado el problema. cd .puede que no sea algo que se ejecute manualmente en el curso habitual de las cosas, pero definitivamente es algo que puede surgir en la ejecución programática (piense en cualquier situación en la que pueda acceder cdal directorio que contiene un archivo, cuya ruta es suministrada por el usuario ) Por lo tanto, no tiene que tener un uso específico: siempre que cumpla con la semántica habitual cd <some-path>, es útil.


12
De acuerdo, .debe tratarse como una ruta válida especificada por la cdsintaxis muy bien.
Sergiy Kolodyazhnyy

18
Puede agregar el siguiente ejemplo: Bucles como while IFS= read Dir; do cd "$Dir"; do_something; done < <(find . -type d). Durante su curso, find produce .como ruta, de modo que el comando se cd "$Dir"expande a cd .. Entonces, en los scripts, es perfectamente útil.
rexkogitans

55
Por ejemplo, un script realmente se ejecuta cd ${path_to_directory}, pero en algún momento resulta que el directorio es el directorio actual, path_to_directory = .por lo que cd .deberá trabajar por si acaso.
Demis

44
En otras palabras, su utilidad radica en el hecho de que hace innecesario el código adicional ( ifverificaciones y elsecláusulas, cualquier tipo de carcasa especial).
jpmc26

2
Por lo tanto, es útil en el sentido de que x + 0 o x * 1 son útiles: la operación específica no es útil per se, pero significa que puede manejar 0 y 1 igual que cualquier otro valor, sin tener que tratarlos como Un caso especial.
user32929

127

La ruta del directorio podría haber cambiado desde que se ejecutó el último comando, y sin cd .los shells bash y ksh93 se basará en el directorio de trabajo lógico descrito en la publicación vinculada en la pregunta, por lo cd .que llamar a que el shell emita el getcwd()syscall garantizará su La ruta actual sigue siendo válida.

Pasos para reproducir en bash:

  1. En una cuestión de pestaña terminal mkdir ./dir_no_1; cd ./dir_no_1
  2. En una cuestión de pestaña de terminal diferente mv dir_no_1 dir_no_2
  3. En el primer tema de la pestaña terminal echo $PWDy pwd. Observe que el directorio ha sido renombrado externamente; El entorno del shell no se ha actualizado.
  4. Problema cd .; pwd; echo $PWD. Observe que el valor ha sido actualizado.

Sin embargo, ksh93 no actualiza la información del entorno, por lo que cd .en ksh93 puede ser inútil. En /bin/dashUbuntu y otros sistemas basados ​​en Debian, cd .devuelve el dash: 3: cd: can't cd to .error, sin embargo cd -P .funciona (a diferencia de ksh93).


22
Es bueno saberlo: lo agregaré a mi lista de información inútil. ^^)
jayooin

12
@jayooin Me alegro de poder contribuir a la lista;)
Sergiy Kolodyazhnyy

8
Creo que puedes hacerlo mv ../dir_no_1 ../dir_no_2en la misma terminal / bash.
ctrl-alt-delor

3
@ ctrl-alt-delor Confirmado, funciona :)
Sergiy Kolodyazhnyy

1
@ymbirtt En la mayoría de los shells, pwdde hecho , está incorporado, sin embargo, la invocación /bin/pwdno tiene ningún efecto en el entorno del shell: las utilidades externas en general no afectan el entorno del shell. La razón por la cual /bin/cdy /bin/pwdexiste es para POSIX conformidad, entre otras cosas. Hay una buena discusión acerca de CD externo algunos de los cuales probablemente se aplica a /bin/pwdasí
Sergiy Kolodyazhnyy

55

Otro caso de uso cd .sería cuando el directorio en el que se encuentra actualmente se haya eliminado y luego se haya creado nuevamente. Considera probar lo siguiente:

  1. Crea un directorio temp
  2. cd temp y luego hacer un ls
  3. Abra otra terminal y elimine y luego vuelva a crear ese directorio temp
  4. De vuelta desde la primera terminal, intente hacer un ls. Esto provocaría un error:ls: cannot open directory .: Stale file handle
  5. cd . y luego hacer un ls funciona bien

3
Esto no siempre funciona. En el guión, por ejemplo, obtendrá: cd: can't cd to .Ahora que lo veo, esto ya se menciona en la respuesta de Sergiy (mover, eliminar / recrear, esencialmente lo mismo: el directorio en el que se encuentra ya no es el que estaba en el original camino)
Olorin

12
Lo uso mucho probando implementaciones remotas. El directorio en el que estoy se eliminará y luego se volverá a crear mediante una automatización y tendré que emitir cd .un problema para moverme al nuevo directorio con el mismo nombre.
HP Williams

2
Lo uso cd .todo el tiempo cuando tengo un shell cuyo directorio de trabajo actual se montó con sshfs pero la sesión ssh se ha cerrado y vuelto a abrir.
jamesdlin

44
En tal caso hago "cd $ PWD". Puede que funcionen otras variantes, pero esta expresa claramente la intención: extraer lo que se supone que es mi ruta actual (es decir, leer el contenido de PWDla variable de entorno), luego recorrer la jerarquía del sistema de archivos desde la raíz, hasta un directorio al que se pueda acceder mediante esa ruta, ya sea en realidad el mismo directorio o no. Esto se ajusta exactamente al caso de uso en esta respuesta.
Stéphane Gourichon

3
Estoy realmente sorprendido, incluso conmocionado, eso cd .funciona cuando el directorio se ha desvinculado y se crea un nuevo directorio diferente en la misma ruta del sistema de archivos. El directorio de trabajo actual se ha desvinculado y, presumiblemente, como parte de eso, ya no tiene una entrada .o .., e incluso si lo tuviera, la .entrada debería continuar apuntándose a sí misma. Parece que el shell o el kernel está ejecutando el comando cd en función del nombre de la ruta del directorio en lugar de simplemente acceder a la .entrada. ¿Alguien puede confirmar ese comportamiento?
Adrian Pronk

36

Puede borrar $OLDPWDcon un rápido cd ., si debe haber un caso en el que no desea que apunte a ningún lugar "interesante". También afectará cd -.


16

Programáticamente es útil como un no-op. Considere una ruta proporcionada desde una entrada externa.

read -p "Path to file: " p
dirn=$(dirname "$p")
file=$(basename "$p")
echo "dirn=$dirn, file=$file"
cd "$dirn"
ls -ld "$file"

Con una ruta como "fred.txt", el directorio se convertirá .encd .


1
Es útil que no arroje un error si ya está en el directorio al que está navegando, pero no diría que es útil como un no-op.
Capitán Man

2
@CaptainMan no arroja un error si ya está en el directorio es (efectivamente) un no-op. El dirnamecomando genera .donde sea necesario para evitar romper el código que espera poder dividir una ruta.
Roaima

15

Esto es común si tuviera que trabajar con un cable USB defectuoso. Después de que un dispositivo se desconecte y vuelva a conectar, y se monte automáticamente en el mismo directorio, debe usarlo cd .para que vuelva a funcionar.


1
¿No dependerá eso de qué tipo de dispositivo, cómo se accede, su sistema de archivos, el sistema operativo, etc.
Gidds

OS, tal vez. Es poco probable que el sistema de archivos sea relevante, siempre y cuando el núcleo pueda encontrar su forma de desmontarlo mientras se está utilizando. En cualquier caso, el comando se usa exactamente en la situación correcta.
user23013

11

Tenga en cuenta que "." es la forma correcta de especificar el nombre del archivo que está abierto como el directorio de trabajo actual de cualquier proceso (incluido un proceso de shell, por supuesto) y "." siempre es un nombre válido de un archivo en todos los directorios, incluido el directorio de trabajo actual. El nombre .puede no ser un nombre válido para un archivo para una instancia determinada de un proceso si, por ejemplo, el directorio de trabajo actual subyacente se ha eliminado (o se ha "dañado", por ejemplo, un identificador NFS obsoleto), pero es un nombre válido de un archivo que se garantiza que existe en cada directorio válido.

Por . lo tanto, debe ser un argumento válido para cualquier comando que acepte el nombre de un directorio y, por lo tanto, en el shell estándar cd .debe ser un comando válido.

Si cd .es útil o no depende de la implementación del shell. Como se mencionó, puede ser útil si el shell restablece su idea interna del nombre de ruta completo del directorio de trabajo actual después de llamar a la llamada del chdirsistema subyacente , por ejemplo, si el directorio subyacente (o alguno de sus padres) ha cambiado de nombre.

Al menos algunas conchas que conozco ( /bin/shen FreeBSD y NetBSD) convertirá cd ""en cd ., que posiblemente se puede describir una característica de apoyo para uso programático en una secuencia de comandos shell donde una variable podría ser utilizado como un parámetro (es decir, la conversión de una sustitución de variables vacío en un " no hacer nada "), aunque el historial de confirmaciones de FreeBSD dice que el cambio se debió directamente a la adición de soporte POSIX para evitar una falla chdir(""), que los mandatos POSIX deben fallar.

Algunos otros shells reemplazarán el .archivo con lo que hayan almacenado como el nombre de ruta completo de su directorio de trabajo actual, y por lo tanto para ellos esto puede permitir el comportamiento mencionado en la respuesta de Sahil Agarwal .


4

Utilicé este comando justo hoy cuando reformulé la rama en la que estaba trabajando en Git, desde un directorio que se había creado por primera vez en esa misma rama. El rebase salió bien pero luego git statusarrojó un error. Después de que cd .todo fue normal.

(Estaba trabajando en MobaXterm en Windows, por cierto. En caso de que esté intentando reproducir esto. Puede que no suceda en otros sistemas).


También he usado este comando en directorios que se actualizan mediante un proceso automatizado que deja de lado el directorio anterior y lo reemplaza por uno nuevo (por lo que es lo más cercano posible a atómico). No es una situación común, pero cd .es exactamente lo que se necesita.


Después de leer esta excelente respuesta de Stephane Chazelas:

Ahora entiendo que mis casos de uso anteriores solo funcionan porque estoy usando bash, en lo que cd .es equivalente a cd "$PWD". Recomiendo leer la respuesta vinculada.


1

Utilizo cd .para volver a ejecutar las cosas que he sobrecargado cda través de una bashfunción.

De mi ~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}

0

EDITAR: Esto ya ha sido sugerido por Sahil anteriormente.

Esto es útil si está dentro de una carpeta que fue eliminada y recreada por otro proceso. Por ejemplo, suponiendo las dos sesiones terminales $1y $2:

$1 mkdir d
$1 cd d
$1 touch f

$2 rm -rf /path/to/d # delete the folder where $1 is in ...
$2 mkdir /path/to/d # ... and recreate it

$1 touch g # cannot create file g because current dir doesn't exist anymore
touch: cannot touch ‘g’: Stale file handle
$1 cd . # go to the newly created dir (same path)
$1 touch g # works fine now

No estoy seguro de dónde está exactamente (OS, SHELL, ...?) La causa raíz de este comportamiento.


Esto ya ha sido mencionado por otras respuestas.
Kusalananda

-8

No, no tiene sentido. Tampoco en las secuencias de comandos, simplemente no hace nada.


2
Dependiendo del shell, se restablecería $PWD, y posiblemente llamaría a otras funciones del shell si el usuario ha proporcionado su propia cdfunción o alias para sobrecargar el incorporado cd. También verificaría que el directorio actual sigue siendo válido y que el uso actual tiene permiso para estar allí.
Kusalananda

1) por supuesto, no estamos hablando de posibles alias personalizados de "cd" sino de la compilación estándar 2) ¿cómo puede estar el uso actual si no tuviera permiso? Para hacerlo simple, solo digo que en el mundo real no hay razón para usarlo en mi opinión.
Federico

1
1) ¿No es así? 2) El mundo real no es simple, y Unix es un sistema operativo multiusuario. Un usuario puede cambiar los permisos en los directorios, y si el script, o el shell interactivo de otro usuario, tiene ese directorio (o un subdirectorio del mismo) como su directorio de trabajo, cd .se quejaría.
Kusalananda

44
Federico, de acuerdo con las reglas del sitio y mis propias reglas personales, debería rechazar su respuesta. Sin embargo, eres nuevo. ¡Bienvenidos! Por favor revise algunas de las otras respuestas . Después de eso, si cree que su respuesta es incorrecta, elimínela. Disfrute dando otras respuestas a esta pregunta y a otras.
daveloyall

2
Especialmente en las secuencias de comandos, a veces "no hace nada" es exactamente lo que se necesita.
Matthew Najmon
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.