Como dice el título, ¿hay alguna diferencia para los sistemas de archivos * NIX? por ejemplo ls file
yls ./file
linux
filesystems
Sergey Alaev
fuente
fuente
Respuestas:
No estoy loco por la explicación de SmallLoanOf1M. Es técnicamente correcto pero responde de una manera que no coincide con el ejemplo de uso en la pregunta.
A modo de ejemplo, aquí hay una diferencia importante entre los dos de la pregunta: "archivo" y "./file"
¿Qué sucede si el archivo se nombra con un carácter analizado por el shell? Especialmente con respecto a los caracteres interpretados por el comando que se está ejecutando.
Específicamente, el carácter "guión": "-". Pero otros personajes son significativos para el caparazón.
Ejemplo. Mi archivo se llamaba "-dingle"
Intenta enumerar el archivo:
Peor aún, ¿qué pasa si el archivo se llamaba "
-rf rmbomb *
"? Ahora intenta eliminarloNi siquiera voy a tratar de ejecutar ese ejemplo, pero espero que entiendas la idea.
Entonces, ¿cómo enumeras un archivo que mira con guión? Uso
./
en frente.Lo mismo para
rm
fuente
ls \-dingle
ols \-rf\ rmbomb\ \*
. Esta puede ser una buena manera de garantizar que cualquier conjunto de comandos dado sea al menos coherente, ya que especificar./
antes de un nombre no escapará de los caracteres después de./
.rm "-rf rmbomb *"
que realmente haría algo malo, en lugar de simplemente hacer que larm
impresión sea un error. Solo es peligroso si olvida citar el nombre del archivo, por lo que se divide la palabra. (especialmente en un script de shell donde ejecuta enrm $file
lugar derm "$file"
. Pero en ese caso, el*
no se expandirá, porque la expansión global no ocurre en el contenido de la expansión variable. Si lo desea, necesitaría uneval
.) De todos modos, si su script divide los nombres de los archivos antes de pasarlos a rm, haría un archivo llamadospace -rf .
o algo así, asírm ./$i
que no ayuda.rm: invalid option -- ' '
, cuando trata de interpretar el espacio después-rf
como un cambio de un solo carácter, porque es parte del mismo argumento. (Y sí, ejecuté esto dentro de un directorio vacío en caso de que haya pasado por alto algo y realmente fuera peligroso: P)IFS=''
y-f
respectivamente. Un ejemplo más raro es queawk
trata un operando (que no sea el primer operando que es el script) que tiene formafoo=bar
como una tarea para ejecutar pero./foo=bar
como un archivo para leer.Si.
Al emitir
file
en la línea de comando, BASH buscará en su variable de entorno $ PATH un archivo con ese nombre. A menos que el archivo resida en un directorio dentro de su variable $ PATH, no se encontrará..
significa el directorio actual../
significa dentro del directorio actual, en términos relativos. Es el equivalente a decir algo así como/home/sheogorath/shivering/isles.img
cuando se invoca./isles.img
mientras se trabaja en el/home/sheogorath/shivering/
directorio.Como tal, se usa comúnmente para ejecutar archivos dentro de su directorio de trabajo "en su lugar".
EDITAR: en su ejemplo,
ls
el shell lo invoca y lo encuentra utilizando la variable de ruta. Su argumento se procesará en su directorio de trabajo, sea lo que sea. Dado que este es el valor predeterminado parals
, no verá ninguna diferencia entre especificarfile
y especificar explícitamente,./file
ya que ambos apuntan a su directorio actual.No todos los comandos aceptarán rutas de archivos en el directorio de trabajo, y algunos esperan que usted establezca los archivos en un directorio que ellos mismos predefinen mediante la configuración. Entre los comandos que aceptan archivos como argumentos, estos comandos son menos comunes
fuente
ls
menciona en la pregunta original. Esa es más la diferencia entre hacer referencia a una ruta relativa (relativa al directorio de trabajo actual) Ie../../dir/filename
y una ruta absoluta/path/to/dir/filename
ls
siempre serán la misma ruta, una especificada más explícitamente que la otra. No todos los comandos se comportan de esta manera cuando procesan argumentos, pero la mayoría sí.