は?
これを質問された時、一瞬困惑しました。
意味を理解するのに30秒程掛かりました。
回答
結論は、
echo $(echo A B C D E F G H | sed 's/ /\n/g' | sort -R | head -n1)カップ
としました。
ではこれを解剖し、意図を示しながら解説していきましょう。
解説
サブシェル
$(...)
はサブシェルと言われ、...
内のコマンドの結果を展開する構文です。
...
に相当する文は、echo A B C D E F G H | sed 's/ /\n/g' | sort -R | head -n1
ですね。
リダイレクト
全てのコマンドは|
(パイプ)で連結されています。
これは、リダイレクトと言われ、パイプの前のコマンドの出力を、パイプの後の入力として渡す構文です。
初期データ
何かを表示、使用するには、それの元となるデータが必要なので、それを与えます。
初期データは、A~H
にしたかったのですが、seq
のアルファベット版が無いような気がしたので、echo
とsed
で生成します。あったら教えて下さい。
まず、echo A B C D E F G H
でスペース区切りのA~H
を出力します。
次に、sed
(文字列を置き換えるコマンド)でスペースを改行に変換します。
今回の変換(引数)はs/ /\n/g
ですね。
最初のs/
はおまじないのようなものなので解説はしません。
次に、スペース一文字が続きますが、これは置き換え元を表します。ABC
にすると、ABC
を置き換えてね、となります。
次には/
(スラッシュ)が来ます。これは、置き換え元と置き換え後の文字列の区切りとなります。
この後に続く\n
は、改行を表します。改行は、これ以降のコマンドの区切りとして使われます。
最後の/g
もまたおまじないのようなものです。/
だけにすると最初のスペースになります。
データをいじる
ここまでで、改行区切りのA~H
が得られました。
これを、いじります。
sed
の出力の送り先はsort -R
ですね。
sort
と聞くと、並び替えと思われますが、sort -R
は違います。1
順番をランダムにします。
つまり、sort -R
によって、何がどこにあるか分からなくなりました。
sort -R
の結果は、head -n1
に渡されます。
head
は入力からN行だけ持ってくる、という事ができます2。
-n1
によって行数が指定されており、スペースを省いているので分かりにくいですが、最初の1行を持ってきてね、と指示しています。
ここで、サブシェルの内容は終わりです。
出力
先程のサブシェルとecho
で簡潔に。
ただし、カップ
を足すのを忘れずに。3
最終的にこのコマンドは、Aカップ
...Hカップ
のいずれかをランダムで出力するものである事が分かります。
使用例
echo $(echo A B C D E F G H | sed 's/ /\n/g' | sort -R | head -n1)カップ#シェル芸
— Inverted nao20010128nao (@2ndLesmi) January 5, 2018