Isso usa "substituição de processo" ( <()
) e um "heredoc" ( cat << EOF...EOF
) para abrir um novo processo bash onde ele executa o "arquivo" de inicialização ( --rcfile
) contendo alias foo="echo hey you
. Aqui está o comando:
bash --rcfile <(
cat << EOF
alias foo="echo hey you"
EOF
)
Funciona bem no Ubuntu, como você pode ver aqui:
$ bash --rcfile <(
> cat << EOF
> alias foo="echo hey you"
> EOF
> )
$ foo
hey you
$ alias
alias foo='echo hey you'
No entanto, quando tento executar isso em determinados dispositivos Linux incorporados, recebo o seguinte erro. Por quê? Como faço para rodar lá também?
-sh: syntax error: unexpected "("
Saída completa:
$ bash --rcfile <( -sh: syntax error: unexpected "(" $ cat << EOF > alias foo="echo hey you" > EOF alias foo="echo hey you" $ ) -sh: syntax error: unexpected ")"
Caso isso ajude, aqui estão minhas saídas which bash
e bash --version
no Ubuntu versus o dispositivo Linux incorporado:
# 1. Ubuntu
$ which bash
/bin/bash
$ bash --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
# 2. Embedded Linux device
$ which bash
/bin/bash
$ bash --version
GNU bash, version 5.0.16(1)-release (aarch64-buildroot-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Não é uma duplicata:
Isso está relacionado, mas não parece ser uma duplicata: dash relata 'Erro de sintaxe: "(" inesperado' ao usar a substituição do processo .
Relacionado:
- [minha própria pergunta] https://stackoverflow.com/questions/69891328/what-is-the-syntax-in-shell-bash-and-how-do-i-search-for-it
Notas para si mesmo
Meu objetivo final é criar automaticamente alguns aliases personalizados quando eu ssh, assim talvez:
ssh -t username@ip_address '/bin/bash --rcfile <(
cat << EOF
alias foo="echo hey you"
EOF
)'
Atualização: feito! Aqui está o que eu inventei:
# Store your password into a file
echo "my_password" > ~/pw
# Manually add something like this to your ~/.bash_aliases (recommended) or ~/.bashrc file on the PC
# you are ssh-ing FROM:
alias gs_ssh="sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp \
&& sshpass -f ~/pw ssh -t -o 'ServerAliveInterval 60' [email protected] 'bash --rcfile /tmp/.bashrc'"
Veja meu repositório aqui: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/tree/master/home/.ssh#optional-but-recommended-alias .
Os dispositivos Linux integrados suportam
/dev/fd/
entradas? Se isso acontecer, tente passar os comandos de inicialização pelo descritor de arquivo #3, assim:EDIT: Stéphane Chazelas sugeriu adicionar
exec 3<&-
como comando final no "script"; isso fecha o descritor de arquivo, portanto, não fica pendente durante toda a sessão do shell.Se a sintaxe do seu comando é ou não suportada ou não, é determinado pelo shell que você está executando no momento.
Seu shell atual é
sh
quando você tenta executar seubash --rcfile <(...)
comando, o que é evidente na mensagem de erro em que o shell se identifica como umsh
shell executando como um shell de login. Esse shell geralmente não entende substituições de processo.Uma maneira de contornar isso é first
exec bash
, que está substituindo o shell atual por um shell que entende as substituições de processo, ou fazer como sugerido por Gordon Davisson e fornecer o arquivo de inicialização temporário por meio de um descritor de arquivo alternativo.Observe que você, em ambos os casos, provavelmente deseja citar o documento here, a menos que precise do shell atual para realizar expansões no documento antes que o novo
bash
shell o leia. Você também pode usarexec bash
se substituir completamente o shell atual é o que deseja fazer.