Como dice el título, ¿hay alguna diferencia para los sistemas de archivos * NIX? por ejemplo ls fileyls ./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
rmfuente
ls \-dingleols \-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 larmimpresió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 $filelugar 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 ./$ique no ayuda.rm: invalid option -- ' ', cuando trata de interpretar el espacio después-rfcomo 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-frespectivamente. Un ejemplo más raro es queawktrata un operando (que no sea el primer operando que es el script) que tiene formafoo=barcomo una tarea para ejecutar pero./foo=barcomo un archivo para leer.Si.
Al emitir
fileen 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.imgcuando se invoca./isles.imgmientras 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,
lsel 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 especificarfiley especificar explícitamente,./fileya 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
lsmenciona 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/filenamey una ruta absoluta/path/to/dir/filenamelssiempre 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í.