Shell comendo '?' personagens

1

Essa é uma pergunta tão simples que tenho certeza de que foi perguntada em algum lugar, mas não consigo encontrá-la. Minha concha, que eu não configurei intencionalmente para fazer isso, parece comer qualquer palavra que envolva pontos de interrogação:

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin13.4.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ echo a ? = =?
a =

$ not-a-command? echo a
a

$ (?) echo a
a

Caso seja importante, note que qualquer palavra que contenha um ponto de interrogação parece desaparecer completamente em silêncio - até o ponto em que ela nunca percebe que a invocação começa com uma palavra que não especifica um executável válido - mesmo que o ponto de interrogação não esteja no começo.

    
por LSpice 15.04.2016 / 17:37

2 respostas

6

Você provavelmente tem a opção nullglob shell ativada; isso faz com que qualquer palavra contendo um caractere globbing ( * ou ? ) seja removido se a glob não corresponder a nada. Assim, se você estiver em uma pasta que não contenha nenhum arquivo, pasta, etc., com um nome de caractere único, ? não será expandido para nada e será removido; da mesma forma, not-a-command? provavelmente não corresponderá a nada e será removido.

Para verificar se esse é o caso, execute

shopt nullglob

Para desativar a opção, execute

shopt -u nullglob
    
por 15.04.2016 / 17:47
2

é como * , mas representa um único caractere

por exemplo. mostre os diretórios raiz de três caracteres:

$ ls -d /???
/bin  /dev  /etc  /lib  /mnt  /opt  /run  /sys  /tmp  /usr  /var

observe que /home não é mostrado porque não corresponde a

Use [?] ou \? ou coloque suas strings entre aspas ( "foo?" ou 'bar?' )

    
por 15.04.2016 / 17:43