porque echo? está retornando um único | personagem para o stdout

4

Estou tentando entender a saída desse comando - echo ? . A saída que vejo é um único caractere | .

    
por Ravi Kumar 29.12.2017 / 17:25

2 respostas

11

Porque ? é um caractere curinga especial para o shell. $ abc não está presente, portanto, é expandido para uma cadeia vazia e ? é substituído por qualquer arquivo ou diretório de um caractere existente no diretório atual. Então, provavelmente existe um arquivo / diretório chamado | em seu diretório atual.

No meu sistema, a saída é diferente:

$ echo $abc?
_ 1

Se não houver um arquivo / diretório de um caractere, o ? sai não expandido.

E, de fato, existem diretórios _ e 1 .

    
por 29.12.2017 / 17:30
1

Porque o? é dividido em uma palavra e contém um caractere glob ( ? ) que basicamente diz:

Print the list of filenames in the current directory that match the glob ?.

O glob ? corresponde a qualquer arquivo com um único caractere. Então, isso funciona:

$ touch a \| b
$ echo ?
| a b
$ ls -l ?
-rw-r--r-- 1 user user 0 Dec 29 10:03 '|'
-rw-r--r-- 1 user user 0 Dec 29 10:03  a
-rw-r--r-- 1 user user 0 Dec 29 10:03  b

Se não houver arquivo / diretório com um caractere, isso acontece:

$ rm a \| b
…
$ echo ?
?

Essa é a saída no bash com as configurações padrão.
Para ver claramente os arquivos:

$ ls -l ?
ls: cannot access '?': No such file or directory

Se nullglob estiver ativado, nenhuma saída será impressa

$ shopt -s nullglob
$ echo ?
$
    
por 29.12.2017 / 21:12