2つのスクリプトがあります。
test_input.sh
SSHを介して実行されるスクリプトです。このスクリプトでは、ユーザーに何かを入力するように求めます。test_ssh_connection.sh
localhost
スクリプトをリンクして実行するスクリプトです。test_input.sh
test_ssh_connection.sh
出力をtest_input.sh
ファイルにリダイレクトしたいのですが、プロンプトを見ることtest_input.sh
ができるので、画面に入力プロンプトを表示したいと思います。
これは私のものですtest_ssh_connection.sh
:
echo "Connecting to localhost and executing an input script."
ssh "localhost" "sh test_input.sh" >> "test.txt"
これはtest_input.sh
:
echo -n "Give me a value: "
read value
echo "You gave me [${value}]."
test.txt
実際に実行後の内容は次のとおりですtest_ssh_connection.sh
。
Give me a value: You gave me [asd].
現在、プロンプトGive me a value:
は端末にのみあり、test.txt
端末にはありません。代わりに私が望むものはそれを端末に表示し、可能であればtest.txt
。
見つけました。これ>/dev/tty
質問がありますが、ssh /を介して呼び出すと添え字が機能しないようです>$(tty)
。
答え1
このため、アプリケーションの通常の出力に属さないプロンプトやその他の対話型メッセージは通常、標準エラーストリームに書き込まれます。たとえば、デフォルトのプロンプトはシェルの標準エラーストリームに書き込まれます。
次のコマンドが与えられると、read
ユーティリティはbash
標準エラーメッセージを表示します-p
。
#!/bin/bash
read -r -p 'Give me a value: ' value
printf 'You gave me [%s].\n' "$value"
あなたに/bin/sh
似た仕事をしてください
#!/bin/sh
printf 'Give me a value: ' >&2
read -r value
printf 'You gave me [%s].\n' "$value"
リダイレクトは>&2
出力をprintf
標準エラーにリダイレクトします。
関連:
あなたは文章を書きたいですか?TTYで直接接続次に、これら2つのバリエーションのうち2番目のバリエーションを使用し、リダイレクトを介してメッセージを表示します>/dev/tty
。ssh -t
これを行うには、疑似TTY割り当てを使用する必要があります。また、これはプロンプトで標準エラーを使用しないため、かなり一般的な習慣が壊れます。