Linux - GNU 版コマンドをシェル組み込み版コマンドより優先させる!

Updated:


linux の time コマンドなどは、シェル組み込み版と GNU 版があり、シェル上ではシェル組み込み版が優先されてしまう。

以下、「GNU 版コマンドを優先させる方法」についての備忘録です。(「コマンドのエイリアスを一時的に無効化する方法」と置き換えてもよい)

0. 前提条件

  • LMDE2(Linux Mint Debian Edition 2, 64bit) での作業を想定。
  • zsh 5.0.7 での作業を想定。(bash でも同様)
  • 以下で登場する半角「バックスラッシュ」は、JIS 環境では半角「円記号」。

1. シェル組み込み版の使用

単に time とした場合は、シェル組み込み版が使用される。

File: シェル組み込み版

1
2
$ time sleep 2
sleep 2  0.00s user 0.00s system 0% cpu 2.044 total

zsh では、 time -p sleep 2 のように -p オプションが使えない。

2. GNU 版の使用・その1

当然、フルパスで GNU 版コマンドを指定すれば、GNU 版を使用できる。(-p オプションも使用できる)

File: GNU版

1
2
3
4
5
6
7
8
$ /usr/bin/time sleep 2
0.00user 0.00system 0:02.03elapsed 0%CPU (0avgtext+0avgdata 1632maxresident)k
8inputs+0outputs (0major+75minor)pagefaults 0swaps

$ /usr/bin/time -p sleep 2
real 2.01
user 0.00
sys 0.00

3. GNU 版の使用・その2

単に time とした場合は、エイリアス機能でシェル組み込み版が優先されるようになっている。

なので、エイリアス機能を無効にするようにすれば、シェル組み込み版が優先されなくなる。

エイリアス機能を無効にするには、コマンドをクォートすればよい。
コマンド全体でなく1文字のみをクォートしてもよいし、ダブルクォートでもシングルクォートでもよい。
さらには、バッククォートの付与で直後の1文字をクォートすることもできる。

以下は、どれも有効。

$ "time" sleep 2

$ "t"ime sleep 2

$ t'im'e sleep 2

$ tim'e' sleep 2

$ \time sleep 2

$ tim\e sleep 2

どれでもよいのだが、一般的にはコマンドの先頭にバッククォートを付与する(=先頭の1文字だけクォートする)ケースがよく使用される。

4. その他

上記では time コマンドを例にしたが、他の例についても紹介する。

例えば、既にコピー先に同じ名称のファイルが存在しても強制的に上書きコピーしたい場合、 cp -f a.txt hoge/ などとすると思うが、 CentOS ではデフォルトで alias cp='cp -i' とエイリアスが設定されていて、上書き確認がされてしまう。
このような場合も、 \cp -f a.txt hoge/ などとバックスラッシュを付与するなどしてコマンドをクォートすることでエイリアスを無効にすることができる。


根本的な理由を理解せず、単に「先頭にバッククォートを付与すればよい」と思っている人も多そうですね。

根本的な理由を理解することで、単に「先頭にバッククォートを付与する」という知識のみでなく、「シェル組み込み版コマンドが GNU コマンド版より優先される(エイリアスが設定されている)」こと、「エイリアスを一時的に無効化する方法が(何種類も)存在する」ことなど、他にも応用できる知識も得られます。

以上、





 

Sponsored Link

 

Comments