テキスト入力を処理し、予想される出力を表示するシェルスクリプトを作成しましたが、期待される結果を表示したら、完了するまで待ってからカーソルをctrl+c
$_スペースに移動できます。これをctrl+c
シェルスクリプト自体にどのように含めることができますか?それともctrl+c
bash / shellコマンドを使用するシェルスクリプトは何ですか?
スクリプトは次のとおりです。
sed 's/\xC2\xA0//g' | awk '$1=="|"{if(f){print f" "$2;f=""}else{f=$2}}' filename.txt
ファイル名.txtには次のものが含まれます。 https://justpaste.it/edit/30310895/df1838c844c0fcd1
答え1
あなたが示すパイプラインは本質的に
sed expression | awk expression filename
これはawk
ファイルで実行され、filename
標準sed
入力からユーザー入力を待っている間は何もしません(この時点で端末に入力したすべての内容を読みます)。
このスクリプトを終了するには、単にクリックしてCtrl+Dプロセス入力の終了を表示しますsed
。これ以上読み取ることができないことがわかると、スクリプトが終了してsed
スクリプトが終了します(これがスクリプトを「一時停止」する理由です)。
現在のスクリプトは、以下を実行するのとほぼ同じです。
awk expression filename
sed expression
...両方のコマンドがパイプを介して互いに通信しないためです。
あなたがしたいことは
sed expression filename | awk expression
ここではsed
ファイルの処理が行われており、さらにawk
処理するために結果が送信されます。ファイル名なしで起動します。つまり、標準出力にパイプされる標準入力から読み取ることを意味しますawk
。sed
あなたの場合
sed 's/\xC2\xA0//g' filename.txt | awk '$1=="|"{if(f){print f" "$2;f=""}else{f=$2}}'
(パイプラインが望みどおりに機能しているかどうかはわかりませんが、少なくともsed
プロセスawk
は正しく送信されます。)
答え2
ctrl-c は "SIGINT" シグナルを送信するため、^C と同じ効果を送信するには、次のようにします。
kill -SIGINT
スクリプトのpid