'-sh:语法错误:尝试使用“bash”在嵌入式 Linux 设备上进行进程替换时出现意外的“(”'

'-sh:语法错误:尝试使用“bash”在嵌入式 Linux 设备上进行进程替换时出现意外的“(”'

这使用“流程替代”( <()) 和一个“赫里多克”( cat << EOF...EOF) 打开一个新的 bash 进程,在其中运行--rcfile包含alias foo="echo hey you.这是命令:

bash --rcfile <(
cat << EOF
alias foo="echo hey you"
EOF
)

它在 Ubuntu 上运行得很好,你可以在这里看到:

$ bash --rcfile <(
> cat << EOF
> alias foo="echo hey you"
> EOF
> )
$ foo
hey you
$ alias
alias foo='echo hey you'

但是,当我尝试在某些嵌入式 Linux 设备上运行此程序时,出现以下错误。为什么?我怎样才能让它也在那里运行?

-sh: syntax error: unexpected "("

完整输出:

$ bash --rcfile <(
-sh: syntax error: unexpected "("
$ cat << EOF
> alias foo="echo hey you"
> EOF
alias foo="echo hey you"
$ )
-sh: syntax error: unexpected ")"

如果这有帮助,这里是我在 Ubuntu 与嵌入式 Linux 设备上的输出which bashbash --version

# 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.

不重复:

这是相关的,但确实不是似乎是重复的:使用进程替换时,破折号报告“语法错误:“(”意外”

有关的:

  1. [我自己的问题]https://stackoverflow.com/questions/69891328/what-is-the-syntax-in-shell-bash-and-how-do-i-search-for-it

自我笔记

我的最终目标是在 ssh 登录时自动创建一些自定义别名,如下所示:

ssh -t username@ip_address '/bin/bash --rcfile <(
cat << EOF
alias foo="echo hey you"
EOF
)'

更新:完成!这是我想出的:

# 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'"

在这里查看我的仓库:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/tree/master/home/.ssh#可选-但是-推荐-别名

答案1

嵌入式Linux设备是否支持/dev/fd/条目?如果这样做,请尝试通过文件描述符 #3 传递初始化命令,如下所示:

bash --rcfile /dev/fd/3 3<<EOF
alias foo="echo hey you"
exec 3<&-
EOF

编辑:Stéphane Chazelas 建议添加exec 3<&-为“脚本”中的最终命令;这会关闭文件描述符,因此它不会在整个 shell 会话中悬空。

答案2

是否支持命令的语法取决于当前运行的 shell。

当前 shell 是sh当您尝试执行bash --rcfile <(...)命令时的情况,从错误消息中可以明显看出,shell 将自己标识为作为sh登录 shell 运行的 shell。该 shell 通常不理解进程替换。

解决这个问题的一种方法是首先exec bash,用一个能够理解进程替换的 shell 替换当前的 shell,或者执行以下操作:正如戈登·戴维森所建议的并通过替代文件描述符提供临时初始化文件。

exec bash

bash --rcfile <( cat <<'BASHRC'
alias foo='echo bumblebee'
BASHRC
)
bash --rcfile /dev/fd/3 3<<'BASHRC'
alias foo='echo bumblebee'
exec 3<&-
BASHRC

请注意,无论哪种情况,您很可能想要引用此处文档,除非您需要当前 shell 在新 shell 读取文档之前在文档中进行扩展bashexec bash如果您想要完全替换当前的 shell,您可能还想使用。

相关内容