Por que o bash exibe '' em vez de executar meu comando?

3

Por que o bash às vezes se recusa a aceitar meus pedidos simplesmente iniciando uma nova linha que começa com um sinal de maior que em vez de executar o comando? Cada vez que você pressiona enter, adiciona uma nova linha, e a única maneira de escapar disso parece estar pressionando Ctrl + C .

Como exemplo: um pequeno comando que às vezes preciso limitar a velocidade do ventilador do meu laptop não está mais funcionando:

RegenbogenBook:Resources Vincent$ smc -k F0Mx -w $(python -c 'print hex(2800 << 2)[2:]’)
>
>
>

Tenho a impressão de que estou apenas sentindo falta de algo realmente óbvio, mas esse tipo de coisa básica não é abordado em nenhuma FAQ ou acessível por meio de pesquisa ...

    
por helplessuser 10.12.2014 / 16:36

4 respostas

11

Você provavelmente está cortando e colando o comando (ou partes dele) de um documento em vez de digitá-lo manualmente. Geralmente isso não faz nenhuma diferença, mas, nesse caso, o segundo caractere de aspas foi inserido como "aspas simples à direita" ( ) em vez de "apóstrofo" ( ' ). A diferença é sutil - veja esta página para mais detalhes:

link

O motivo pelo qual isso provavelmente aconteceu foi que, quando você digitou o comando no documento pela primeira vez para salvá-lo para referência futura, o processador de textos converteu automaticamente o segundo apóstrofo em aspas simples à direita. Ele faz isso para fazer o personagem parecer mais bonito na tela, mas bash não reconhece esse personagem como uma citação de fechamento válida, então você se depara com o problema. Ele imprime " > " para solicitar mais informações, porque ainda acha que a cotação original não foi fechada.

A correção é alterar esse caractere para um apóstrofo - basta redigitá-lo manualmente no bash do teclado. E você também pode corrigi-lo em seu documento para que o futuro corte + colagem funcione bem.

    
por 10.12.2014 / 17:04
1

Sua última citação é redonda, então a string que você está passando para python não está terminada. Você pode ver a diferença na coloração sintática:

smc -k F0Mx -w $(python -c 'print hex(2800 << 2)[2:]’)

vs

smc -k F0Mx -w $(python -c 'print hex(2800 << 2)[2:]')
    
por 10.12.2014 / 16:39
0

O > que você está vendo é porque o shell ainda está aguardando a entrada. Como a resposta de fredtantini afirmou que você não fechou corretamente sua declaração.

Há outras vezes em que você vê o prompt de entrada secundário (chamado PS2 no Bash). Certos comandos interativos, como mailx , usarão isso para preencher os campos de e-mail. Você pode fechar um prompt de entrada secundário enviando EOF para o shell pressionando Ctrl + D .

    
por 10.12.2014 / 16:48
0

Problema

Como todos os outros disseram, o OP tem uma string não terminada em sua instrução python . Você confundiu uma cotação arredondada com uma única cotação.

Uso pretendido

Já que o OP não sabia sobre o Secundária Prompt , eu queria mostrar o OP um exemplo tirado do Linux From scratch - Versão 7.6 com systemd livro, e explicar como isso funciona. É assim que o prompt é usado na maioria dos casos:

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools

export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
echo "/bin/sh -> 'readlink -f /bin/sh'"
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
if [ -e /usr/bin/yacc ];
  then echo "/usr/bin/yacc -> 'readlink -f /usr/bin/yacc'";
  else echo "yacc not found"; fi

bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
if [ -e /usr/bin/awk ];
  then echo "/usr/bin/awk -> 'readlink -f /usr/bin/awk'";
  else echo "awk not found"; fi

gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-  # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl 'perl -V:version'
sed --version | head -n1
tar --version | head -n1
xz --version | head -n1

echo 'main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
  then echo "g++ compilation OK";
  else echo "g++ compilation failed"; fi
rm -f dummy.c dummy

EOF

Raciocínio

A única ferramenta utilizada pelo Linux do Scratch é o Terminal. A fim de se certificar de que o livro rompe com a versão de compilação host, o livro instrui-lo a digitar todos os scripts e arquivos de configuração usando o comportamento do OP pensava que era um problema. A primeira linha cria um aqui documento que terá o nome version-check.sh quando terminar. Abaixo está uma imagem de um terminal Cygwin do script completo:

Observe que o script contém CR / LF, que cria espaços em branco no documento e aumenta a legibilidade. Cada CR / LF cria uma nova instância da > , e até ao final noEOF%, todas as > de criar o tampão que se torna version-check.sh .

    
por 10.12.2014 / 17:42

Tags