Lendo um literal de stdin - Erro de redirecionamento ambíguo ao usar EOF

0

Estou tentando ler uma string literal em stdin usando o seguinte método:

#!/usr/bin/env bash

set -e;

gmx --stdin < 'cat <<EOF
   node e "console.log('foo')"
EOF'

quando eu executo isso, recebo este erro:

simple.sh: line 5: 'cat <<EOF
   node e "console.log('foo')"
EOF': ambiguous redirect

Se eu me livrar dos backticks,

 gmx --stdin < cat <<EOF
       node e "console.log('foo')"
 EOF

Eu recebo este erro:

/simple.sh: line 5: cat: No such file or directory

alguém sabe como consertar? Se não estiver claro o que estou tentando fazer - estou apenas tentando ler uma string literal no stdin do processo gmx.

Eu também tentei isso:

gmx --stdin <<<  node e "console.log('foo')"

mas parece que isso não funcionou, talvez precise colocar o comando node entre aspas, o que anula o propósito do que estou tentando fazer. Eu estou olhando para incluir variáveis shell no comando - HEREDOC é bom porque eu não preciso escapar "caracteres.

    
por Alexander Mills 06.05.2018 / 22:33

2 respostas

1

Acontece que tudo que eu precisava fazer era fazer isso:

gmx --stdin <<EOF
   node e "console.log('foo')"
EOF

que leria a linha começando com node como uma string literal no stdin do comando gmx.

    
por 06.05.2018 / 23:42
1

Original :

< precisa de arquivos ou descritores de arquivos, enquanto você tem a substituição de comandos, que substitui quaisquer que sejam os backticks por uma cadeia de texto.

Para seu objetivo, talvez seja melhor usar a substituição de processos em bash . Algo parecido com isto:

gmx --stdin < <(node e "console.log('foo')")

Ou outro exemplo de clareza:

wc -l < <(df)

Editar :

Para passar literal de string que representa o comando, você pode usar:

gmx --stdin <<< "$(echo node -e $'"console.log(\'foo\')"' )"

o $'...' permite a citação em C, que é o que faz o \'foo\' .

Aqui está basicamente o mesmo exemplo, mas com pipe (o que pode não funcionar se um comando exigir uma entrada lseekable )

$ touch with\ space
$ echo stat $'\'with space\''
stat 'with space'
$ echo stat $'\'with space\'' | sh
  File: with space
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d  Inode: 1069455     Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/     xie)   Gid: ( 1000/     xie)
Access: 2018-05-07 05:01:37.638553045 +0800
Modify: 2018-05-07 05:01:37.638553045 +0800
Change: 2018-05-07 05:01:37.638553045 +0800
 Birth: -

Além disso, há uma maneira de lidar com aspas via printf %q , que de help printf é descrito como:

quote the argument in a way that can be reused as shell input

Portanto, a solução potencial é

printf '%q'  'node -e "conlose.log('foo')"' | gmx --stdin

ou

gmx --stdin <<< "$( printf '%q'  'node -e "conlose.log('foo')"' )"
    
por 06.05.2018 / 22:41