
私は多くの質問、回答、コメントがウィットではなく、脚本の作成に対する軽蔑(時には恐怖)を表現していることを確認しました。だから私は知りたいです:
いつ、なぜ「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つの解決策は別の解決策から容易に導き出すことができるので(将来の読者のために)読みやすくするために。
答え2
書くスクリプトいつ:
- コードがもっと必要です。
- あなたは読みやすさを大切にしています
- コードの機能を示すためにコメントを追加する必要があるか便利です。
- パラメータを渡す必要があります。
- スクリプトを独自の環境(変数など)で実行したいです。
- より複雑な目的でコードを再利用/適用できます。
書く一行いつ:
- 少量のコードしか必要ありません。
- 現在、シェルで定義されている変数にアクセスしたいと思います。
- 迅速で汚い解決策が必要です
答え3
必要な一連のコマンドが非常に短いまたはより大きなパイプラインまたはコマンドエイリアスの一部として使用できる結果を生成する場合は、良い1行のコマンドになります。
基本的に、私の考えの冗談は、一般的に問題についてよく知っている経験豊富なシステム管理者が使用するコマンドをあまり考えなくても、その場で書き留めることです。
行が長すぎる、または非常に単純な条件またはループ以上が含まれている場合は、一般的に読みやすくするために複数行のスクリプトまたはシェル関数で書くのが最善です。さらに、使用する内容や他の人が使用する内容(および問題を解決できる内容)を作成する場合は、時間をかけて解決策を明確な形式で作成する必要があります。 )レビュー、スクリプトフォーム。
Pythonのインデントは構文の一部なので、コード行を書くと実際に言語機能を最大限に活用できません。
Perlとawkの1行ステートメントには正規表現の基本機能を使用することがよくあります。しかし、一部の人々は正規表現を書き込み専用言語と呼びますが、これは完全に非合理的ではありません。複数行のスクリプトを作成すると、特定の正規表現が実行する必要があるアクションを説明するコメントを作成できます。
これは本質的に非常に意見中心の質問です。許容可能なレベルの複雑さと読みやすさと簡潔さのバランスを考慮することです。これらすべては個人的な判断に大きく依存します。言語の選択も個人的な問題によって異なります。特定の言語が理論的に特定の問題に最も適していますが、その言語に慣れておらず、すでに他の言語の問題を解決する方法を知っている場合は、おなじみの言語を選択できます。ソリューションが技術的にやや非効率的であっても、最小限の労力で作業をすばやく完了することです。
最高しばしば敵十分、ここに非常に適用可能です。
Perlに慣れている場合は、TMTOWTDIについて聞いたことがあります。これを行う方法はいくつかあります。
答え4
私は一時的な開発ツールとして1行のコードを見て使用して、私の要件を満たすまで繰り返し編集したり、サブコマンドがどのように機能するかをある程度微妙に理解したりできます。
その後、調査中のトピックのテキストファイルにコメントを付け、コメントを付けるか、スクリプトで整理してプライベートbin PATHに入れて、追加の改善、パラメータ化などに使用できます。他の変更がない場合やスクリプトを再利用しなくても、読みやすくするために行が分割されることがよくあります。
各端末と各リモートログインなどに対して別々の履歴を使用して、シェル履歴を5000行以上に設定しました。私は数週間前に開発し、もはや必要ではないと判断した1行のコマンドをこのレコードに見つけることができず、私の戦略を見つけることができないことを嫌います。
時々、いくつかのハードウェアを構成するなどのタスクを実行するには、完全な命令セットが必要です。すべてのコマンドを履歴からコピーし、最小限のクリーンアップを実行してから、RUNME
Iのようにシェルスクリプトに追加します。コメントは同じです。 、そしてほとんど常に他の人が再利用することができます。 (これが私がそんなに痛みを伴うように構成するためにGUIだけを提供するツールを探す理由です。)一度やりたいことを5回行う必要がある場合が多いので、これが効率性の面で膨大な利得だと思います。 。