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.
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.
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.
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')"' )"
Tags bash shell shell-script