这使用“进程替换”(<()
)和“heredoc”(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 ")"
如果这有帮助,这是我在 Ubuntuwhich bash
与bash --version
嵌入式 Linux 设备上的输出:
# 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.
不重复:
这是相关的,但似乎不是重复的:dash 报告 'Syntax error: "(" unexpected' when using process substitution。
有关的:
给自己的笔记
我的最终目标是在我 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#optional-but-recommended-alias 。
嵌入式 Linux 设备是否支持
/dev/fd/
条目?如果是这样,请尝试通过文件描述符 #3 传递初始化命令,如下所示:编辑:Stéphane Chazelas 建议
exec 3<&-
在“脚本”中添加为最终命令;这将关闭文件描述符,因此它不会在整个 shell 会话中悬空。是否支持您的命令语法取决于您当前运行的任何 shell。
您当前的 shell 是
sh
当您尝试执行bash --rcfile <(...)
命令时,这从错误消息中可以明显看出,其中 shell 将自己标识为sh
作为登录 shell 运行的 shell。此 shell 通常不理解进程替换。解决此问题的一种方法是首先
exec bash
,即用理解进程替换的 shell 替换当前 shell,或者按照 Gordon Davisson 的建议进行操作,并通过替代文件描述符提供临时初始化文件。请注意,在任何一种情况下,您很可能都希望引用 here-document,除非您需要当前 shell 在新
bash
shell 读取文档之前在文档中执行扩展。exec bash
如果您想要完全替换当前的外壳,您可能还想使用。