私は多くの質問、回答、コメントがウィットではなく、脚本の作成に対する軽蔑(時には恐怖)を表現していることを確認しました。だから私は知りたいです:
いつ、なぜ「1行」ではなくスタンドアロンスクリプトを書くべきですか?あるいはその逆も?
2つのユースケースと長所と短所は何ですか?
一部の言語(awkやPerlなど)は、他の言語(Pythonなど)よりも1行の言語に適していますか?では、なぜそうなのでしょうか?
それは単なる個人的な好みの問題なのでしょうか、それとも与えられた状況でどちらかについて書くべき妥当な(つまり客観的な)理由がありますか?この理由は何ですか?
定義
one-liner
:入力または貼り付けた一連のコマンドシェルコマンドラインに直接入力。通常、配管および/またはsed
、awk
および/または、などperl
のツールを使用する作業が含まれます。grep
cut
sort
コマンドラインから直接実行することは、長さと形式に依存しない定義機能です。 「1行」はすべて1行にあっても複数行でもかまいません(例:sh forループ、挿入されたawkまたはsedコード、読みやすくするための改行、インデントなど)。
script
:解釈された言語の一連のコマンドファイルに保存その後、実行します。スクリプトは完全に1つの言語で書くことも、異なる言語の複数の「1行」を使用するシェルスクリプトラッパーです。
私は自分の答えを持っていますが(後で投稿する予定です)、これが私の個人的な意見ではなく、トピックに関する正式なQ&Aになることを願っています。
ベストアンサー1
実際の経験に基づくもう一つの答えです。
プロンプトで直接作成できる「廃棄」コードであれば、1行のコードを使用します。たとえば、次のように使用できます。
for h in host1 host2 host3; do printf "%s\t%s\n" "$h" "$(ssh "$h" uptime)"; done
コードを保存する価値があると思われる場合は、スクリプトを使用します。この時点で、ファイルの上部に説明を追加し、エラーチェックを追加し、バージョン管理のためにコードストアにチェックインすることもできます。たとえば、サーバーグループの稼働時間を確認することが繰り返し使用する便利な機能であると判断した場合は、上記の行を次のように拡張できます。
#!/bin/bash
# Check the uptime for each of the known set of hosts
########################################################################
#
hosts=(host1 host2 host3)
for h in "${hosts[@]}"
do
printf "%s\t" "$h"
uptime=$(ssh -o ConnectTimeout=5 -n "$h" uptime 2>/dev/null)
printf "%s\n" "${uptime:-(unreachable)}"
done
要約すると、次のように言えます。
一つの線
- 特定のワンタイム目的のために書かれた単純なコード(例:「いくつかの」文)
- 必要に応じてコードをすばやく簡単に作成できます。
- 使い捨てコード
スクリプト
- (おそらく)1回または複数回使用されるコード
- 複数の文が必要な複雑なコード
- 他人が維持する必要があるコード
- 他の人がコードを理解できるようにする
- 無人で実行されるコード(例:from
cron
)
ここで質問がたくさんあります。UNIXSE特定のタスクを実行するために冗談を求めてください。上記の例を見ると、2番目の例は最初の例よりも理解しやすく、読者がもっと学ぶことができると思います。 1つの解決策は別の解決策から容易に導き出すことができるので(将来の読者のために)読みやすくするために。