O comando Ls no script bash diz 'Nenhum arquivo ou diretório'

2

O seguinte é o script que estou executando

#$1 - Argument
declare IPATH="sample/"
declare F=$IPATH$1
echo $F
ls $F

A entrada é ./script.sh "Fil*"

A saída de eco é -

sample/Fil*

quando eu executo o comando ls sample/Fil* eu recebo a saída necessária - Uma lista de arquivos cujo nome começa com FIL e estão na pasta de amostra como esta -

sample/File  sample/File1  sample/File2

Mas o script lança a exceção abaixo. O que estou fazendo errado?

ls: sample/Fil*: No such file or directory ls: $IPATH: No such file or directory
    
por user657592 13.01.2014 / 12:58

3 respostas

8

Globs não são expandidos em citações . Você pode expandi-los dentro de scripts, mas é uma prática muito ruim (E se alguém tivesse um nome de arquivo contendo * ou ? ? Eles não seriam capazes de usar seu script para manipulá-lo) . A melhor prática é citar todas as referências de variáveis nos scripts e passar os caminhos reais para os scripts:

$ mkdir sample
$ touch sample/File1 sample/File2
$ cat script.sh 
#!/bin/sh
F="$1"
echo "$F"
ls "$F"
$ ./script.sh sample/Fil*
sample/File1
sample/File1

Ou melhor ainda, faça um loop sobre todos os arquivos:

$ cat script.sh 
#!/bin/sh
for path
do
    echo "$path"
    ls "$path"
done
$ ./script.sh sample/Fil*
sample/File1
sample/File1
sample/File2
sample/File2

Se você quiser codificar parte do caminho, você pode usar find para expandi-lo:

while IFS= read -r -d '' -u 9 path
do
    ls -- "$path"
done 9< <( find "sample" -name "$1" -exec printf '%s
$ mkdir sample
$ touch sample/File1 sample/File2
$ cat script.sh 
#!/bin/sh
F="$1"
echo "$F"
ls "$F"
$ ./script.sh sample/Fil*
sample/File1
sample/File1
' {} + )
    
por 13.01.2014 / 13:40
-1

ls é executado em um shell separado. Nesse shell, o IPATH não está definido, já que você não o exportou.

Altere "declare" com "export" e funcionará.

    
por 13.01.2014 / 13:01
-1

Pegue a palavra-chave declarar e ela funcionará. Não é necessário digitar no Bash:

   #!/bin/sh
   IPATH="sample/"
   F=$IPATH$1
   echo $F
   ls $F

Isso funcionará como você espera.

    
por 13.01.2014 / 13:42