bash -c "/tmp/printargs \"abc\""
Tem certeza de que é isso que você quer fazer? Se você executar isso com set -x
em vigor, verá que o comando que é executado é
bash -c '/tmp/printargs \abc\'
i.e. você está passando o shell uma string que termina em uma barra invertida. Sua primeira string entre aspas contém uma barra invertida de escape, então você tem uma abc
sem aspas, uma barra invertida de escape e, em seguida, uma string entre aspas vazia. (Observe como o realce de sintaxe feito pelo Stackexchange mostra o abc
não é citado).
A contra-barra invertida no final da entrada não faz muito sentido. Uma barra invertida escapa do caractere seguinte ou inicia uma linha de continuação, onde é excluída junto com a nova linha seguinte, como aqui:
$ bash -c $'echo "foo\\nbar"'
foobar
Este caso não tem nenhum. Você está possivelmente tentando fazer um destes:
bash -c "/tmp/printargs \"abc\""
bash -c '/tmp/printargs "abc"'
Ambos produzem a saída ARG |abc|
.
Podemos ver a diferença entre os shells com um teste um pouco mais simples:
$ bash -c 'echo $BASH_VERSION; echo abc\'
4.4.12(1)-release
abc\
$ ./bash -c 'echo $BASH_VERSION; echo abc\'
4.3.30(1)-release
abc
$ dpkg -l dash |grep ^i
ii dash 0.5.8-2.4 amd64 POSIX-compliant shell
$ dash -c 'echo abc\'
abc\
$ dpkg -l zsh |grep ^i
ii zsh 5.3.1-4+b2 amd64 shell with lots of features
$ zsh -c 'echo abc\'
abc
Se eu tivesse que adivinhar, começaria a procurar a origem da alteração nessa alteração:
This document details the changes between this version, bash-4.4-alpha, and
the previous version, bash-4.3-release.
1. Changes to Bash
cccc. Fixed a bug that resulted in short-circuited evaluation when reading
commands from a string ending in an unquoted backslash, or when sourcing
a file that ends with an unquoted backslash.