文字がファイルから来たかのようにコマンドに文字を送信するにはどうすればよいですか?
たとえば、次のことを試しました。
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
答え1
サポートされるシェルからここに文字列がありますbash
、 、zsh
などをksh93
使用できます。
wc <<< "apple pear orange"
答え2
他の2つの方法(追加の努力なしに複数行入力可能):
「こちらのドキュメント」をご利用ください。
$wc << EOF リンゴ梨オレンジ EOF 1 3 18 $
文字列
EOF
は区切り文字です。EOF
一般的な選択だけで任意の文字列を使用できます。tty を入力として使用します。
$トイレ リンゴ梨オレンジ Ctrl+D 1 3 18 $
この方法の欠点は、プログラム名を入力するとすぐにプログラムが実行を開始し、入力内容を読み始めるということです。たとえば、次のようになります。
$grep v アジャイルブラウンキツネ (タイプ) 飛び越える (タイプ) 飛び越える (これはgrepの出力です!) 怠惰な犬。 (タイプ) Ctrl+D (ここでは出力はありません) $
答え3
これにはいくつかの有効なソリューションがありますが、時には便利な別の構文があります<()
。これにより、コマンドラインから複数のファイル記述子オブジェクトを作成できます。
これは、長いテキスト文字列を比較したり、ファイルにない項目を比較したい場合に便利です。
たとえば、ホストファイルをローカルホストにコピーせずに両方のノードのホストファイルを比較するには、次のようにします。
diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')
<
ファイルをSTDINにリダイレクトし、()
サブシェルを作成して角括弧の間でコマンドを実行します。実行中のコマンドのSTDINに渡されるサブシェルのSTDOUT。
コマンドへの複数の入力「ファイル」の作成は、複数のドキュメントを使用するか、複数のコマンドを最終コマンドに再パイプするよりも簡単な方法です。
答え4
予想に似たものを使いたいかもしれません。以下は、リモート Telnet セッションを開く、プロンプト待機、一部のデータ転送、応答待ち、スリープ、シャットダウンの簡単な例です。
#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1