‘-sh: 語法錯誤:在嵌入式 Linux 設備上嘗試使用 bash
進行程序替換時出現意外的 ‘(’’
這使用“程序替換”(
<()
)和“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 ")"
如果這有幫助,這是我在 Ubuntu
which 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。
有關的:
- $$ my own question $$ 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 root@192.168.0.2:/tmp \ && sshpass -f ~/pw ssh -t -o 'ServerAliveInterval 60' root@192.168.0.2 'bash --rcfile /tmp/.bashrc'"
在這裡查看我的倉庫:https ://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/tree/master/home/.ssh#optional-but-recommended-alias 。
嵌入式 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 會話中懸空。
是否支持您的命令語法取決於您目前執行的任何 shell。
您目前的 shell 是
sh
當您嘗試執行bash --rcfile <(...)
命令時,這從錯誤消息中可以明顯看出,其中 shell 將自己標識為sh
作為登錄 shell 執行的 shell。此 shell 通常不理解程序替換。解決此問題的一種方法是首先
exec bash
,即用理解程序替換的 shell 替換目前 shell,或者按照 Gordon Davisson 的建議進行操作,並通過替代文件描述符提供臨時初始化文件。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
請注意,在任何一種情況下,您很可能都希望引用 here-document,除非您需要目前 shell 在新
bash
shell 讀取文件之前在文件中執行擴展。exec bash
如果您想要完全替換目前的外殼,您可能還想使用。