POSIXコマンド一覧.md生成シェル芸

# 完成品
こちらが完成品です。
<details><summary>表</summary><div>

|no |command|desc_en|desc_ja|
|---|-------|-------|-------|
|001|admin|create and administer SCCS files (DEVELOPMENT)|SCCSファイルの作成と管理（開発）|
|002|alias|define or display aliases|エイリアスを定義または表示する|
|003|ar|create and maintain library archives|ライブラリアーカイブの作成と維持|
|004|asa|interpret carriage-control characters|紙送り制御文字を解釈する|
|005|at|execute commands at a later time|後でコマンドを実行する|
|006|awk|pattern scanning and processing language|パターンスキャンおよび処理言語|
|007|basename|return non-directory portion of a pathname|パス名の非ディレクトリ部分を返します|
|008|batch|schedule commands to be executed in a batch queue|バッチキューで実行されるコマンドをスケジュールする|
|009|bc|arbitrary-precision arithmetic language|任意精度の算術言語|
|010|bg|run jobs in the background|バックグラウンドでジョブを実行する|
|011|c99|compile standard C programs|標準Cプログラムのコンパイル|
|012|cal|print a calendar|カレンダーを印刷する|
|013|cat|concatenate and print files|ファイルを連結して印刷する|
|014|cd|change the working directory|作業ディレクトリを変更する|
|015|cflow|generate a C-language flowgraph (DEVELOPMENT)|C言語のフローグラフを生成する（開発）|
|016|chgrp|change the file group ownership|ファイルグループの所有権を変更する|
|017|chmod|change the file modes|ファイルモードを変更する|
|018|chown|change the file ownership|ファイルの所有権を変更する|
|019|cksum|write file checksums and sizes|ファイルのチェックサムとサイズを書き込む|
|020|cmp|compare two files|2つのファイルを比較する|
|021|comm|select or reject lines common to two files|2つのファイルに共通する行を選択または拒否する|
|022|command|execute a simple command|簡単なコマンドを実行する|
|023|compress|compress data|データを圧縮する|
|024|cp|copy files|ファイルをコピーする|
|025|crontab|schedule periodic background work|定期的なバックグラウンド作業のスケジュール|
|026|csplit|split files based on context|コンテキストに基づいてファイルを分割する|
|027|ctags|create a tags file (DEVELOPMENT, FORTRAN)|タグファイルを作成する（DEVELOPMENT、FORTRAN）|
|028|cut|cut out selected fields of each line of a file|ファイルの各行の選択されたフィールドを切り取る|
|029|cxref|generate a C-language program cross-reference table (DEVELOPMENT)|C言語プログラム相互参照テーブルを生成する（開発）|
|030|date|write the date and time|日付と時刻を書く|
|031|dd|convert and copy a file|ファイルを変換してコピーする|
|032|delta|make a delta (change) to an SCCS file (DEVELOPMENT)|SCCSファイルにデルタ（変更）を加える（開発）|
|033|df|report free disk space|空きディスク容量を報告する|
|034|diff|compare two files|2つのファイルを比較する|
|035|dirname|return the directory portion of a pathname|パス名のディレクトリ部分を返します|
|036|du|estimate file space usage|ファイルスペースの使用量を見積もる|
|037|echo|write arguments to standard output|引数を標準出力に書き込む|
|038|ed|edit text|テキストを編集|
|039|env|set the environment for command invocation|コマンド呼び出しの環境を設定する|
|040|ex|text editor|テキストエディタ|
|041|expand|convert tabs to spaces|タブをスペースに変換する|
|042|expr|evaluate arguments as an expression|引数を式として評価します|
|043|false|return false value|偽の値を返す|
|044|fc|process the command history list|コマンド履歴リストを処理する|
|045|fg|run jobs in the foreground|フォアグラウンドでジョブを実行する|
|046|file|determine file type|ファイルタイプを決定する|
|047|find|find files|ファイルを見つける|
|048|fold|filter for folding lines|折り線用フィルター|
|049|fort77|FORTRAN compiler (FORTRAN)|FORTRANコンパイラー（FORTRAN）|
|050|fuser|list process IDs of all processes that have one or more files open|1つ以上のファイルが開いているすべてのプロセスのプロセスIDを一覧表示する|
|051|gencat|generate a formatted message catalog|フォーマットされたメッセージカタログを生成する|
|052|get|get a version of an SCCS file (DEVELOPMENT)|SCCSファイルのバージョンを取得する（開発）|
|053|getconf|get configuration values|構成値を取得する|
|054|getopts|parse utility options|解析ユーティリティのオプション|
|055|grep|search a file for a pattern|ファイルのパターンを検索する|
|056|hash|remember or report utility locations|ユーティリティの場所を記憶または報告する|
|057|head|copy the first part of files|ファイルの最初の部分をコピーします|
|058|iconv|codeset conversion|コードセット変換|
|059|id|return user identity|ユーザーIDを返す|
|060|ipcrm|remove an XSI message queue, semaphore set, or shared memory segment identifier|XSIメッセージキュー、セマフォセット、または共有メモリセグメント識別子を削除する|
|061|ipcs|report XSI interprocess communication facilities status|XSIプロセス間通信機能の状態を報告する|
|062|jobs|display status of jobs in the current session|現在のセッションのジョブのステータスを表示する|
|063|join|relational database operator|リレーショナルデータベースオペレーター|
|064|kill|terminate or signal processes|プロセスの終了またはシグナル|
|065|lex|generate programs for lexical tasks (DEVELOPMENT)|字句タスク用のプログラムを生成する（開発）|
|066|link|call link function|リンク機能を呼び出す|
|067|ln|link files|リンクファイル|
|068|locale|get locale-specific information|ロケール固有の情報を取得する|
|069|localedef|define locale environment|ロケール環境を定義する|
|070|logger|log messages|ログメッセージ|
|071|logname|return the user's login name|ユーザーのログイン名を返します|
|072|lp|send files to a printer|ファイルをプリンターに送信する|
|073|ls|list directory contents|ディレクトリの内容を一覧表示する|
|074|m4|macro processor|マクロプロセッサ|
|075|mailx|process messages|プロセスメッセージ|
|076|make|maintain, update, and regenerate groups of programs (DEVELOPMENT)|プログラムのグループの維持、更新、および再生成（開発）|
|077|man|display system documentation|ディスプレイシステムのドキュメント|
|078|mesg|permit or deny messages|メッセージを許可または拒否する|
|079|mkdir|make directories|ディレクトリを作る|
|080|mkfifo|make FIFO special files|FIFO特殊ファイルを作成します|
|081|more|display files on a page-by-page basis|ページごとにファイルを表示する|
|082|mv|move files|ファイルを移動する|
|083|newgrp|change to a new group|新しいグループに変更する|
|084|nice|invoke a utility with an altered nice value|nice値を変更してユーティリティを呼び出す|
|085|nl|line numbering filter|行番号フィルター|
|086|nm|write the name list of an object file (DEVELOPMENT)|オブジェクトファイルの名前リストを作成します（DEVELOPMENT）|
|087|nohup|invoke a utility immune to hangups|ハングアップの影響を受けないユーティリティを呼び出す|
|088|od|dump files in various formats|さまざまな形式のダンプファイル|
|089|paste|merge corresponding or subsequent lines of files|ファイルの対応する行または後続の行をマージします|
|090|patch|apply changes to files|ファイルに変更を適用する|
|091|pathchk|check pathnames|パス名を確認する|
|092|pax|portable archive interchange|ポータブルアーカイブ交換|
|093|pr|print files|印刷ファイル|
|094|printf|write formatted output|フォーマットされた出力を書き込む|
|095|prs|print an SCCS file (DEVELOPMENT)|SCCSファイルを印刷する（開発）|
|096|ps|report process status|プロセスの状態を報告する|
|097|pwd|return working directory name|作業ディレクトリ名を返します|
|098|qalter|alter batch job|バッチジョブを変更する|
|099|qdel|delete batch jobs|バッチジョブを削除する|
|100|qhold|hold batch jobs|バッチジョブを保留する|
|101|qmove|move batch jobs|バッチジョブを移動する|
|102|qmsg|send message to batch jobs|バッチジョブにメッセージを送信する|
|103|qrerun|rerun batch jobs|バッチジョブを再実行する|
|104|qrls|release batch jobs|リリースバッチジョブ|
|105|qselect|select batch jobs|バッチジョブを選択する|
|106|qsig|signal batch jobs|シグナルバッチジョブ|
|107|qstat|show status of batch jobs|バッチジョブのステータスを表示する|
|108|qsub|submit a script|スクリプトを提出する|
|109|read|read from standard input into shell variables|標準入力からシェル変数に読み込む|
|110|renice|set nice values of running processes|実行中のプロセスのnice値を設定します|
|111|rm|remove directory entries|ディレクトリエントリを削除する|
|112|rmdel|remove a delta from an SCCS file (DEVELOPMENT)|SCCSファイルからデルタを削除します（開発）|
|113|rmdir|remove directories|ディレクトリを削除する|
|114|sact|print current SCCS file-editing activity (DEVELOPMENT)|現在のSCCSファイル編集アクティビティを印刷（開発）|
|115|sccs|front end for the SCCS subsystem (DEVELOPMENT)|SCCSサブシステムのフロントエンド（開発）|
|116|sed|stream editor|ストリームエディター|
|117|sh|shell, the standard command language interpreter|シェル、標準コマンド言語インタープリター|
|118|sleep|suspend execution for an interval|間隔を置いて実行を一時停止する|
|119|sort|sort, merge, or sequence check text files|テキストファイルの並べ替え、マージ、またはシーケンスチェック|
|120|split|split a file into pieces|ファイルを断片に分割する|
|121|strings|find printable strings in files|ファイル内の印刷可能な文字列を見つける|
|122|strip|remove unnecessary information from strippable files (DEVELOPMENT)|削除可能なファイルから不要な情報を削除する（開発）|
|123|stty|set the options for a terminal|端末のオプションを設定する|
|124|tabs|set terminal tabs|端子タブを設定する|
|125|tail|copy the last part of a file|ファイルの最後の部分をコピーします|
|126|talk|talk to another user|別のユーザーと話す|
|127|tee|duplicate standard input|標準入力を複製|
|128|test|evaluate expression|式を評価する|
|129|time|time a simple command|簡単なコマンドを実行する|
|130|touch|change file access and modification times|ファイルのアクセス時間と変更時間を変更する|
|131|tput|change terminal characteristics|端末の特性を変更する|
|132|tr|translate characters|文字を翻訳する|
|133|true|return true value|真の値を返す|
|134|tsort|topological sort|トポロジカルソート|
|135|tty|return user's terminal name|ユーザーの端末名を返す|
|136|type|write a description of command type|コマンドタイプの説明を書く|
|137|ulimit|set or report file size limit|ファイルサイズの制限を設定または報告する|
|138|umask|get or set the file mode creation mask|ファイルモード作成マスクを取得または設定します|
|139|unalias|remove alias definitions|エイリアス定義を削除する|
|140|uname|return system name|システム名を返す|
|141|uncompress|expand compressed data|圧縮データを展開する|
|142|unexpand|convert spaces to tabs|スペースをタブに変換する|
|143|unget|undo a previous get of an SCCS file (DEVELOPMENT)|SCCSファイルの以前の取得を取り消します（開発）|
|144|uniq|report or filter out repeated lines in a file|ファイル内の繰り返し行を報告または除外する|
|145|unlink|call the unlink function|リンク解除関数を呼び出す|
|146|uucp|system-to-system copy|システム間コピー|
|147|uudecode|decode a binary file|バイナリファイルをデコードする|
|148|uuencode|encode a binary file|バイナリファイルをエンコードする|
|149|uustat|uucp status enquiry and job control|uucpステータス照会とジョブ制御|
|150|uux|remote command execution|リモートコマンド実行|
|151|val|validate SCCS files (DEVELOPMENT)|SCCSファイルの検証（開発）|
|152|vi|screen-oriented (visual) display editor|画面指向（視覚）ディスプレイエディター|
|153|wait|await process completion|プロセスの完了を待つ|
|154|wc|word, line, and byte or character count|単語、行、バイトまたは文字数|
|155|what|identify SCCS files (DEVELOPMENT)|SCCSファイルの識別（開発）|
|156|who|display who is on the system|システム上のユーザーを表示します|
|157|write|write to another user|別のユーザーに書き込む|
|158|xargs|construct argument lists and invoke utility|引数リストを作成し、ユーティリティを呼び出す|
|159|yacc|yet another compiler compiler (DEVELOPMENT)|さらに別のコンパイラコンパイラ（開発）|
|160|zcat|expand and concatenate data|データを展開および連結する|

</div></details>

# 動機
[この記事](https://qiita.com/richmikan@github/items/e4cb1537d38966c10f4b)を読んで、**POSIXにある全コマンド**の説明についてのチートシートをMarkdownのtableで作ることを考えた。
また英語と並べて日本語の説明を機械翻訳に投げた結果も取得したくなった。
# やること
- 全コマンドとその説明の取得
- [trans](https://www.soimort.org/translate-shell/)コマンドで説明を翻訳
- Markdown形式のtableへの変換(nl,commandname,desc_ja,desc_en)

# やっていき

実行しながら記事を書いていく
まず数確認

```bash:Terminal
$ curl -s "https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html"|grep -oE ">[^<]+<"|uniq -u|wc -l 
160
```

ほーん、160個あんのか
説明文と行番号ほしいな

```bash:Terminal
$ curl -s "https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html" \
   | grep -oE ">[^<]+<" | tr -d "<>" \
   | while read i;do
       curl -s "https://pubs.opengroup.org/onlinepubs/9699919799/utilities/${i}.html" \
        | grep -oEm1 '<blockquote>.*</blockquote>'
   done | sed -r 's_<[^>]+>__g' | nl -nln -w3
```

```txt:result
001     admin - create and administer SCCS files (DEVELOPMENT)
002     alias - define or display aliases
003     ar - create and maintain library archives
004     asa - interpret carriage-control characters
(略)
160     zcat - expand and concatenate data
```
なるほどなあ
翻訳をしたいな

```bash:Terminal
$ sudo apt install translate-shell
$ echo hello | trans -s en -t ja
hello
/heˈlō,həˈlō/

こんにちは
(Kon'nichiwa)

Definitions of hello
[ English -> 日本語 ]

noun
    今日は
        hello, good day

hello
    こんにちは, もしもし
```
`-b`をつけるといい

```bash:Terminal
$ echo hello world|trans -s en -t ja -b                                                   
こんにちは世界
```

前記のコードに`|tee >(sed -r 's_^[^-]+- __'|trans -s en -t ja -b)|tr \\n \\t`追記
`@`文字をフィールドセパレータに

```bash:Terminal
$ curl -s "https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html" \
   | grep -oE ">[^<]+<" | tr -d "<>" \
   | while read i;do
       curl -s "https://pubs.opengroup.org/onlinepubs/9699919799/utilities/${i}.html" \
        | grep -oEm1 '<blockquote>.*</blockquote>' \
        | tee >(sed -r 's_^[^-]+- __' | trans -s en -t ja -b) \
        | tr \\n @
   done | sed -r 's_<[^>]+>__g' | nl -nrz -w3 | sed -r 's/( {2,})/@/g' > data_posi
```
いい感じ
MarkdownにしてQiitaに貼り付けて終わり

```bash:Terminal
$ cat << EOS > list.md
|no |command|desc_en|desc_ja|
|---|-------|-------|-------|
$(sed -r 's_(^|@|$)_|_g' data_posix)
EOS
```
実行！しかし`trans`が途中から結果を返していない
どうやらAPI制限らしいので`sleep $[5+$RANDOM%10]`の待ちを入れる
〜一晩経って書き直す〜

```bash:make_posix_cmds
#!/bin/bash

url='https://pubs.opengroup.org/onlinepubs/9699919799'

curl -s "${url}/idx/utilities.html"      |
grep -oE '>[^<]+<'                       |
tr -d '<>'                               |
while read  i                            ;
do curl -s "${url}/utilities/${i}.html"  |
grep -oEm1 '<blockquote>.*</blockquote>' |
sed -r 's/<[^>]+>//g'                    |
tee >(                                   #
  sed -r 's/^[^-]+- //'                  |
  trans -s en -t ja -b                   #
)                                        |
tr \\n @                                 ;
sleep $[5+$RANDOM%10]                    ;
done                                     |
nl -nrz -w3                              |
sed -r 's/^([0-9]+)\s+/\1@/g;s/(^[0-9]+@[0-9a-z]+) - /\1@/g'  > cmd_posix


# ==================
# make a table by md
# ==================

cat << EOS > list.md
|no |command|desc_en|desc_ja|
|---|-------|-------|-------|
$(sed -r 's_(^|@|$)_|_g' cmd_posix)
EOS
```
※清書はこちら([Gist](https://gist.github.com/eggplants/4db81263d247d090c32ed2588961bf27))

よし実行！ (13~40分かかる)
〜1時間後〜
できた！


# おわり
シェル芸は最高