Bash

‘-sh: 語法錯誤:在嵌入式 Linux 設備上嘗試使用 bash 進行程序替換時出現意外的 ‘(’’

  • November 9, 2021

這使用“程序替換”<())和“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 bashbash --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

有關的:

  1. $$ 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 &lt;(
cat &lt;&lt; EOF
alias foo="echo hey you"
EOF
)'

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

# Store your password into a file
echo "my_password" &gt; ~/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&lt;&lt;EOF
alias foo="echo hey you"
exec 3&lt;&-
EOF

編輯:Stéphane Chazelas 建議exec 3&lt;&-在“腳本”中添加為最終命令;這將關閉文件描述符,因此它不會在整個 shell 會話中懸空。

是否支持您的命令語法取決於您目前執行的任何 shell。

您目前的 shell 是sh當您嘗試執行bash --rcfile &lt;(...)命令時,這從錯誤消息中可以明顯看出,其中 shell 將自己標識為sh作為登錄 shell 執行的 shell。此 shell 通常不理解程序替換。

解決此問題的一種方法是首先exec bash,即用理解程序替換的 shell 替換目前 shell,或者按照 Gordon Davisson 的建議進行操作,並通過替代文件描述符提供臨時初始化文件。

exec bash

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

請注意,在任何一種情況下,您很可能都希望引用 here-document,除非您需要目前 shell 在新bashshell 讀取文件之前在文件中執行擴展。exec bash如果您想要完全替換目前的外殼,您可能還想使用。

引用自:https://unix.stackexchange.com/questions/676676