Ajuda com script bash

3

Eu estou ensinando a mim mesmo bash scripting com o livro 'Learning the Bash Shell' de Newbam. Estou dando certo com o livro, mas estou um pouco confuso com o script a seguir. É um script que usa um loop for para percorrer os diretórios em $PATH e imprimir informações sobre eles. O script é

IFS=:
for dir in $PATH; do
 if [ -z "$dir" ]; then dir=.; fi
 if ! [ -e "$dir" ]; then
 echo "$dir doesn't exist"
 elif ! [ -d "$dir" ]; then
 echo "$dir isn't a directory"
 else
  ls -ld $dir
done

O que me deixa confuso é por que se dir é zero, ou não existe, estamos definindo esse valor nulo como o diretório atual? Ou estamos mudando o diretório para o nosso diretório atual (em qualquer diretório onde estejamos)? O script, em seguida, parece testar se dir existe e, em seguida, testa se é um diretório.

Alguém pode lançar luz sobre esse aspecto do roteiro para mim? Eu teria pensado que se [ -z "$dir" ] fosse verdade, isso indicaria que o diretório não existe e não é um diretório para começar?

    
por John D 04.09.2015 / 13:28

4 respostas

4

O teste -z está testando um valor de comprimento zero em $dir , não para nada relacionado a um diretório real. Essa condição é acionada se você tiver uma sequência :: na variável PATH , ponto no qual definimos o valor da variável $dir como . , ou seja, o diretório atual, e então conduzimos os dois testes padrão sobre isso.

    
por 04.09.2015 / 13:37
1

Se $ dir estiver vazio (teste -z), então $ dir está definido como. (diretório atual onde você iniciou o script).

Agora, suponha que seu $ PATH esteja malformado como PATH = / bin :: / usr / bin: / usr / local / bin Na segunda posição você tem um campo vazio. Então, quando o campo está vazio, ele é substituído pelo diretório atual de onde é iniciado o script (então dir =.).

    
por 04.09.2015 / 13:53
0

talvez haja um elif (else if) ausente.

no entanto, este script tem como objetivo listar o conteúdo de $ dir, mas primeiro certifique-se de

  1. $dir exists if ! [ -e "$dir" ]
  2. $dir é um dir, não um arquivo, pipe, dev elif ! [ -d "$dir" ]

thoses teste não pode ser feito com valor vazio para $ dir, então a primeira linha ( if [ -z "$dir" ]; then dir=.; fi ) é usada para relatar uma string vazia por. que é um dir e existe.

A string vazia $ dir pode ser feita de duas formas

  • PATH=/usr/bin:/sbin::$HOME/bin
  • PATH=/usr/bin:/sbin:$MYAPPBINDIR:$HOME/bin (onde $MYAPPBINDIR está vazio).
por 04.09.2015 / 13:38
0

A partir da especificação POSIX para PATH (você terá que rolar um pouco):

(ênfase minha)

PATH

This variable shall represent the sequence of path prefixes that certain functions and utilities apply in searching for an executable file known only by a filename. The prefixes shall be separated by a ( ':' ). When a non-zero-length prefix is applied to this filename, a shall be inserted between the prefix and the filename if the prefix did not end in . A zero-length prefix is a legacy feature that indicates the current working directory. It appears as two adjacent characters ( "::" ), as an initial preceding the rest of the list, or as a trailing following the rest of the list. A strictly conforming application shall use an actual pathname (such as .) to represent the current working directory in PATH. The list shall be searched from beginning to end, applying the filename to each prefix, until an executable file with the specified name and appropriate execution permissions is found. If the pathname being sought contains a , the search through the path prefixes shall not be performed. If the pathname begins with a , the specified path is resolved (see Pathname Resolution). If PATH is unset or is set to null, the path search is implementation-defined. Since is a separator in this context, directory names that might be used in PATH should not include a character.

Minha suposição é que a especificação POSIX aceita a cadeia vazia para acomodar sistemas que não usaram . , ou não tinham nenhum nome especial, como um nome para o diretório de trabalho atual.

    
por 05.09.2015 / 14:26

Tags