Qual é a vantagem de usar bash -c em vez de usar uma string here?

11

Existe algum benefício real em usar bash -c 'some command'demaisbash <<< 'some command'

Eles parecem alcançar o mesmo efeito.

yosefrow
fonte
Olá @Patrick, obrigado pelo aviso. Eu realmente não tinha certeza de onde era o melhor lugar para postar. Como, por um lado, esta é uma questão do Linux, mas, por outro lado, o bash é um tipo de linguagem de script e o outro site tem mais visitantes. Em um caso como esse, onde seria o local mais apropriado para postar?
yosefrow
4
@ yosefrow: Qualquer site teria sido bom IMHO; mas a interposição cruzada é desagradável (você está pedindo às pessoas nos dois sites que dediquem algum tempo à sua pergunta, sem dar a elas o benefício das respostas umas das outras).
ruach
Seria apropriado excluir a postagem de um dos sites?
yosefrow
2
Outra pequena diferença é que bash -c '...'funcionará em conchas que não têm herestrings. Você está assumindo que o bash será chamado dentro de um shell do bash, mas nem sempre será esse o caso.
Joel Cornett

Respostas:

21

bash -c 'some command'retém o acesso à entrada padrão do chamador; portanto, os readcomandos de leitura da entrada padrão funcionarão normalmente. bash <<< 'some command'substitui a entrada com a linha que está sendo transmitido, por isso bash -c cate bash <<< catfazer coisas diferentes.

$ bash -c cat
abc
abc
^D
$ bash <<< cat
$

Por outro lado, você pode usar esse recurso para fornecer sua própria entrada padrão a ser usada $'...', se você for muito cuidadoso:

$ bash <<< $'read x y\nabc def ghi\necho $y'
def ghi
$

Eu não gostaria de confiar nisso, mas às vezes poderia ser conveniente.


bash -ctambém permite que argumentos sejam passados ​​para o script e $0sejam definidos:

bash -c 'some command' sh abc def

irá definir $1para abce $2para defdentro some command.

Michael Homer
fonte
3
Erros de sintaxe também produzirão palavras ligeiramente diferentes. Principalmente os que bash -cmencionam -c, AFAIK. Não é totalmente inútil, pois isso pode ajudar a localizá-los. bash <<< 'script'erros se parecem com os do script pai; bash -c 'script'outros não. Você pode até mesmo classificá-los: bash -c 'script' label.
derobert
Bem, bash <<< 'echo $1' /dev/stdin foofunciona também e imprime foo. Embora a configuração $0seja um pouco mais limitada.
precisa saber é o seguinte
bash <<< 'echo "$1"' /dev/stdin foonem sempre funciona. Eu tenho bash <<< 'echo "$1"' -s fooque trabalhar
G-Man diz 'Reinstate Monica'