这使用“流程替代”( <()
) 和一个“赫里多克”( 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 bash
:bash --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.
不重复:
这是相关的,但确实不是似乎是重复的:使用进程替换时,破折号报告“语法错误:“(”意外”。
有关的:
自我笔记
我的最终目标是在 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 读取文档之前在文档中进行扩展bash
。exec bash
如果您想要完全替换当前的 shell,您可能还想使用。