Como o título diz, existe alguma diferença para os sistemas de arquivos * NIX? por exemplo ls file
els ./file
linux
filesystems
Sergey Alaev
fonte
fonte
Respostas:
Não sou louco pela explicação de SmallLoanOf1M. É tecnicamente correto, mas responde de uma maneira que não corresponde ao exemplo de uso na pergunta.
Então, a título de exemplo, aqui está uma diferença importante entre os dois da questão: "arquivo" e "./arquivo"
E se o arquivo for nomeado com um caractere que é analisado pelo shell? Especialmente em relação aos caracteres interpretados pelo comando que um está executando.
Especificamente, o caractere "traço": "-". Mas outros caracteres são significativos para o shell.
Exemplo. Meu arquivo foi nomeado "-dingle"
Tente listar o arquivo:
Pior ainda, e se o arquivo tiver o nome "
-rf rmbomb *
"? Agora tente removê-loNem vou tentar dar esse exemplo, mas espero que você entenda.
Então, como você lista um arquivo com o traço? Use
./
na frente.O mesmo vale para
rm
fonte
ls \-dingle
ouls \-rf\ rmbomb\ \*
. Essa pode ser uma boa maneira de garantir que qualquer conjunto de comandos seja pelo menos consistente, pois especificar./
antes que um nome não escape caracteres após o./
.rm "-rf rmbomb *"
que realmente faria algo ruim, em vez de apenas cometerrm
um erro de impressão. Só é perigoso se você esquecer de citar o nome do arquivo, para que a divisão de palavras aconteça. (especialmente em um script de shell em que você executa, emrm $file
vez derm "$file"
. Mas, nesse caso, o*
não será expandido, porque a expansão glob não acontece no conteúdo da expansão variável. Se você quiser isso, precisará de umeval
.) De qualquer forma, se o seu script dividir os nomes dos arquivos antes de passar para a rm, eu faria um arquivo chamadospace -rf .
ou algo assim, entãorm ./$i
não ajuda.rm: invalid option -- ' '
quando ele tenta interpretar o espaço depois-rf
como uma opção de caractere único, porque faz parte do mesmo argumento. (E sim, eu corri isso dentro de uma pasta vazia no caso de eu tinha esquecido alguma coisa e foi realmente perigoso: P)IFS=''
e-f
respectivamente. Um exemplo mais raro é queawk
trata um operando (que não seja o primeiro operando que é o script) tendo formafoo=bar
como uma atribuição a ser executada, mas./foo=bar
como um arquivo a ser lido.Sim.
Ao emitir
file
na linha de comando, o BASH pesquisará na variável de ambiente $ PATH um arquivo com esse nome. A menos que o arquivo resida em um diretório dentro da sua variável $ PATH, ele não será encontrado..
significa o diretório atual../
significa dentro do diretório atual, em termos relativos. É o equivalente a dizer algo como/home/sheogorath/shivering/isles.img
quando invocar./isles.img
enquanto estiver trabalhando no/home/sheogorath/shivering/
diretório.Como tal, é comumente usado para executar arquivos dentro do seu diretório de trabalho "no local".
EDIT: No seu exemplo,
ls
está sendo chamado pelo shell e encontrado usando a variável path. Seu argumento será processado em seu diretório de trabalho, seja ele qual for. Como esse é o padrãols
, você não verá nenhuma diferença entre especificarfile
e explicitamente./file
, pois ambos apontam para o diretório atual.Nem todos os comandos aceitam caminhos de arquivos no diretório ativo, e alguns esperam que você exiba os arquivos em um diretório que eles próprios pré-definem via configuração. Entre os comandos que aceitam arquivos como argumentos, esses comandos são menos comuns
fonte
ls
mencionado na pergunta original. Isso é mais a diferença entre refferencing um caminho relativo (relativo ao diretório de trabalho atual) Ie../../dir/filename
e um caminho absoluto/path/to/dir/filename
ls
eles sempre serão o mesmo caminho, um especificado mais explicitamente que o outro. Nem todos os comandos se comportam dessa maneira ao processar argumentos, mas a maioria o faz.