ワンライナーの代わりにスクリプトを書くことへの軽蔑(そして時には恐れさえ)を表現する多くの質問と回答とコメントに気づきました。だから、私は知りたいです:
-
「ワンライナー」ではなく、いつ、なぜスタンドアロンのスクリプトを書く必要があるのですか?またはその逆?
-
両方のユースケースと長所と短所は何ですか?
-
一部の言語(awkやperlなど)は、他の言語(pythonなど)よりもワンライナーに適していますか?もしそうなら、なぜですか?
-
それは単に個人的な好みの問題ですか、それとも特定の状況でどちらか一方を書くのに良い(つまり客観的な)理由がありますか?それらの理由は何ですか?
定義
-
ワンライナー
:シェルコマンドラインに直接入力または貼り付けられたコマンドのシーケンス 。多くの場合、パイプラインやsed
などの言語の使用が含まれます 、awk
、perl
、および/またはgrep
などのツール またはcut
またはsort
。特徴的なのはコマンドラインでの直接実行です。長さとフォーマットは関係ありません。 「ワンライナー」はすべて1行である場合もあれば、複数行である場合もあります(たとえば、sh for loop、埋め込みawkまたはsedコード、読みやすさを向上させるための改行とインデント付き)。
-
スクリプトコード> :ファイルに保存される解釈された言語のコマンドのシーケンス 、実行されます。スクリプトは完全に1つの言語で記述されている場合もあれば、他の言語を使用する複数の「ワンライナー」のシェルスクリプトラッパーである場合もあります。
私には自分の答えがありますが(後で投稿します)、これを個人的な意見だけでなく、このテーマに関する標準的なQ&Aにしたいと思います。
承認された回答:
実務経験に基づく別の回答。
プロンプトで直接記述できる「捨てる」コードの場合は、ワンライナーを使用します。たとえば、私はこれを使用するかもしれません:
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回限りの目的で記述された単純なコード(つまり、「いくつかの」ステートメント)
- 必要なときにいつでもすばやく簡単に記述できるコード
- 使い捨てコード
-
スクリプト
- (おそらく)1回または2回以上使用されるコード
- 「少数」以上のステートメントを必要とする複雑なコード
- 他の人が管理する必要のあるコード
- 他の人が理解できるコード
- 無人で実行するコード(たとえば、
cron
から) )
ここunix.SEには、特定のタスクを実行するためのワンライナーを求める質問がかなりの数あります。上記の私の例を使用すると、2番目の例は最初の例よりもはるかに理解しやすいと思います。したがって、読者はそれからより多くを学ぶことができます。 1つのソリューションは他のソリューションから簡単に導き出すことができるため、(将来の読者のために)読みやすくするために、最も些細なソリューション以外のコードを1行にまとめて提供することはおそらく避けてください。
関連:mkdir、touchなどのbash / shellパス名の拡張?