2文字の linuxコマンドはいくつ?

5 min読了の目安(約3000字TECH技術記事

きっかけ

github cliのニュースをみてちょっと気になりました。
https://cli.github.com/

gh というコマンドなのね。 hg は mercurialだよな~と。
そういえば、2文字のコマンドってどれくらいあるのだろう。と思いました。

調べ方

とりあえず、自分の環境を調べてみます。環境は以下。

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"

とりあえずこんなシェルスクリプトを書きました。

#!/bin/bash

awk '
BEGIN {
    c = "abcdefghijklmnopqrstuvwxyz"
    for(i=1; i<=length(c); i++){
        for(j=1; j<=length(c); j++){
            system("which " substr(c,i,1) substr(c,j,1))
        }
    }
}
'

which aa, which ab, which ac .... which zy, which zzと繰り返し実行するだけです。
参考 : https://www.gnu.org/software/gawk/manual/gawk.html#index-system_0028_0029-function

結果は以下。私の環境では 42個ありました。(全部知ってるコマンドですか?)

$ ./sample.sh | wc -l
42
$ ./sample.sh 
/usr/bin/ar
/usr/bin/as
/usr/bin/bc
/usr/bin/cc
/usr/bin/cp
/usr/bin/dc
/usr/bin/dd
/usr/bin/df
/usr/bin/du
/usr/bin/ed
/usr/bin/ex
/usr/bin/gs
/usr/bin/hd
/usr/bin/id
/usr/sbin/ip
/usr/sbin/iw
/usr/bin/ld
/usr/bin/ln
/usr/bin/lp
/usr/bin/ls
/usr/bin/lz
/usr/bin/mt
/usr/bin/mv
/usr/bin/nc
/usr/bin/nl
/usr/bin/nm
/usr/bin/od
/usr/bin/pr
/usr/bin/ps
/usr/bin/rm
/usr/bin/sg
/usr/bin/sh
/usr/bin/ss
/usr/bin/su
/usr/sbin/tc
/usr/bin/tr
/usr/bin/ua
/usr/bin/ul
/usr/bin/uz
/usr/bin/vi
/usr/bin/wc
/usr/bin/xz

結果をみて気づいたのですが、よく使うコマンド(cdとか)が出ていません。
whichコマンドは 組み込み関数は表示されないようです。

なので、以下のように修正してみます(最初からこうすればよかった)。
which コマンドを typeコマンドに変更。そして、"not found(該当コマンドなし)"は表示しないようにしています。

#!/bin/bash

awk '
BEGIN {
    c = "abcdefghijklmnopqrstuvwxyz"
    for(i=1; i<=length(c); i++){
        for(j=1; j<=length(c); j++){
            system("type " substr(c,i,1) substr(c,j,1) " | grep -v \"not found\" " )
        }
    }
}
'

結果はこちら。

$ ./sample.sh | wc -l
49
$ ./sample.sh
ar is /usr/bin/ar
as is /usr/bin/as
bc is /usr/bin/bc
bg is a shell builtin
cc is /usr/bin/cc
cd is a shell builtin
cp is /usr/bin/cp
dc is /usr/bin/dc
dd is /usr/bin/dd
df is /usr/bin/df
do is a shell keyword
du is /usr/bin/du
ed is /usr/bin/ed
ex is /usr/bin/ex
fg is a shell builtin
fi is a shell keyword
gs is /usr/bin/gs
hd is /usr/bin/hd
id is /usr/bin/id
if is a shell keyword
in is a shell keyword
ip is /usr/sbin/ip
iw is /usr/sbin/iw
ld is /usr/bin/ld
ln is /usr/bin/ln
lp is /usr/bin/lp
ls is /usr/bin/ls
lz is /usr/bin/lz
mt is /usr/bin/mt
mv is /usr/bin/mv
nc is /usr/bin/nc
nl is /usr/bin/nl
nm is /usr/bin/nm
od is /usr/bin/od
pr is /usr/bin/pr
ps is /usr/bin/ps
rm is /usr/bin/rm
sg is /usr/bin/sg
sh is /usr/bin/sh
ss is /usr/bin/ss
su is /usr/bin/su
tc is /usr/sbin/tc
tr is /usr/bin/tr
ua is /usr/bin/ua
ul is /usr/bin/ul
uz is /usr/bin/uz
vi is /usr/bin/vi
wc is /usr/bin/wc
xz is /usr/bin/xz

ここまでやったので、
aliasも確認してみましょう

$ alias 
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

2文字のコマンドを作りたいとき(?)の参考にしてください。