Como dice el título, ¿hay alguna diferencia para los sistemas de archivos * NIX? por ejemplo ls file
yls ./file
fuente
Como dice el título, ¿hay alguna diferencia para los sistemas de archivos * NIX? por ejemplo ls file
yls ./file
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:
ls -dingle
# ls -dingle
ls: invalid option -- 'e'
Peor aún, ¿qué pasa si el archivo se llamaba " -rf rmbomb *
"? Ahora intenta eliminarlo
rm "-rf rmbomb *"
Ni 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.
# ls ./-dingle
./-dingle
Lo mismo para rm
ls \-dingle
o ls \-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 la rm
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 en rm $file
lugar de rm "$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 un eval
.) De todos modos, si su script divide los nombres de los archivos antes de pasarlos a rm, haría un archivo llamado space -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 que awk
trata un operando (que no sea el primer operando que es el script) que tiene forma foo=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 para ls
, no verá ninguna diferencia entre especificar file
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
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í.