これは以下を使用します。「プロセス置換」(<()
)と「ブリードッグ」(cat << EOF...EOF
)は新しいbashプロセスを開き、ここで--rcfile
includeを実行します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 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.
繰り返さない:
これは関係ありますが、いいえ重複しているようです。プロセス置換を使用すると、Dashは「構文エラー:」(「予期しない」エラー)を報告します。。
関連:
自分に関するメモ
私の究極の目標は、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
どちらの場合も、新しいシェルがドキュメントを読む前にドキュメントを拡張するために現在のシェルが必要ない限り、ここでドキュメントを参照するのが最善ですbash
。exec bash
現在のシェルを完全に交換したい場合にも使用できます。