Linux - linux/bash コマンドを使用して Ctrl+C を送信し、特定のシェルスクリプトをインポートします。

Linux - linux/bash コマンドを使用して Ctrl+C を送信し、特定のシェルスクリプトをインポートします。

テキスト入力を処理し、予想される出力を表示するシェルスクリプトを作成しましたが、期待される結果を表示したら、完了するまで待ってからカーソルをctrl+c$_スペースに移動できます。これをctrl+cシェルスクリプト自体にどのように含めることができますか?それともctrl+cbash / 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処理するために結果が送信されます。ファイル名なしで起動します。つまり、標準出力にパイプされる標準入力から読み取ることを意味しますawksed

あなたの場合

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

関連情報