Bashでawkとechoを使用する方法

Bashでawkとechoを使用する方法

bashスクリプトで実行した場合(例:これ)コンテンツをファイルに送信するには:

sudo ./bar.sh > foo

コンテンツbar.sh:

echo 'for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done'

foo出力:

for pid in $(ps -ef | grep "smbd" | awk {print }); do kill -9 $pid &> /dev/null; done

$2外で迷子になりました。

予想出力:

for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done

どうやって入手できますか?

答え1

まず、sudo必ず必要な場合以外は絶対に実行しないでください。sudo。私はこれを十分に強調することはできません。 「Permission Denied」エラーが発生しない限り、それを使用する必要はなく、sudo使用しないでください。したがって、実行するsudo必要はありません。sudo ./bar.sh./bar.sh

echo次に、コマンド結果を得る必要はありません。これは必要ありません。

echo '$(ps -ef | grep "smbd" | awk '{print $2}')'

必要なのは、コマンド自体を実行するだけです。コマンド置換($(command))またはエコーは必要ありません。スクリプトに以下を追加するだけです。

ps -ef | grep "smbd" | awk '{print $2}'

実行中のプロセスのPIDを取得したい場合は、実際にはどちらも必要ありませんps。結果に表示されるプロセス自体の問題を回避するためにこれを使用できますpgrep smbdgrep

最後に、複数行の文字列を出力として印刷するには、次のようにします。ここに文書があります多くのechoドアの代わりに。したがって、これらすべてをまとめると、次のようになりますbar.sh

#!/bin/sh

cat <<'EoF'
for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do 
    kill -9 "$pid" &> /dev/null
done
EoF

それから実行してください./bar.sh > foo(いいえsudo!)。

あるいは、同じアプローチのより簡単なバージョンは次のとおりです。

#!/bin/sh

cat <<'EoF'
ps -ef | awk '/smbd/{print $2}' | while read pid; do 
    kill -9 "$pid" &> /dev/null
done
EoF

またはより簡単に:

#!/bin/sh

printf '%s\n' 'kill -9 $(pgrep smbd)'

最後のポイントは次のとおりです。あなたはそうですか?確かに本当に台本が欲しいですか?実行中のすべてのプロセスを終了するには、smbd次の1つのコマンドのみが必要です。

pkill -9 smbd

関連情報