'-sh:構文エラー:組み込みLinuxデバイスでプロセスの置き換えに 'bash'を使用しようとしたときに予期しない '(''

'-sh:構文エラー:組み込みLinuxデバイスでプロセスの置き換えに 'bash'を使用しようとしたときに予期しない '(''

これは以下を使用します。「プロセス置換」<())と「ブリードッグ」cat << EOF...EOF)は新しいbashプロセスを開き、ここで--rcfileincludeを実行します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 ")"

役に立つ場合は、Linuxデバイスが組み込まれているUbuntuからの出力は次のとおりです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.

繰り返さない:

これは関係ありますが、いいえ重複しているようです。プロセス置換を使用すると、Dashは「構文エラー:」(「予期しない」エラー)を報告します。

関連:

  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#Optional-but-recommended-alias

答え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<&-「スクリプト」の最後のコマンドとして追加することを提案しました。これにより、ファイル記述子が閉じて、シェル全体のセッション中に停止しなくなります。

答え2

コマンド構文がサポートされているかどうかは、現在実行されているシェルによって異なります。

現在のシェルはコマンドをsh実行しようとしたときに発生し、シェルがログインシェルとして実行されているシェルとして自分自身を識別するbash --rcfile <(...)ことはエラーメッセージから明らかです。shシェルは通常、プロセス置換を理解していません。

この問題を解決する 1 つの方法は、まず、exec bash現在のシェルをプロセス置換を理解するシェルに置き換えるか、次のことを行うことです。Gordon Davidsonが提案したように代替ファイル記述子を介して一時初期化ファイルを提供します。

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

どちらの場合も、新しいシェルがドキュメントを読む前にドキュメントを拡張するために現在のシェルが必要ない限り、ここでドキュメントを参照するのが最善ですbashexec bash現在のシェルを完全に交換したい場合にも使用できます。

関連情報