目的
- 知人に「RHEL6とRHEL7では、cshの前ゼロ付きの数字の扱いが違う」と聞きました
- RHEL6 では
@
コマンドで、前ゼロ付きの数字は(当然)8進数として扱われます - RHEL7 では前ゼロ付きでも10進数で扱われるようになったらしい
- 「RHELクローン」といわれる CentOS 7 で動作を確認してみました
- (個人的には csh は、あまり使わないんだけどね)
CentOS 7 で確認
環境
名前 | バージョン |
---|---|
CentOS | 7.1.1503 |
tcsh | 6.18.01 |
bash | 4.2.46 |
expr | 8.22 |
確認結果
とりあえず、実行してみました。
$ csh
$ set prompt="% "
% @ var = 014 - 04
% echo $var
10
% @ var = 14 - 4
% echo $var
10
確かに、前ゼロ付きでも10進数になっていますね。
マニュアル man csh
を確認すると parseoctal
というシェル変数が追加されていて、何か値を設定すると今まで通り8進数で扱えるみたいです。
% set parseoctal=true
% @ var = 014 - 04
% echo $var
8
% unset parseoctal
% @ var = 014 - 04
% echo $var
10
% exit
ここでは true
に設定していますが、設定値は何でもよさそうです。
(ちなみにパーミッションやumask などは、このシェル変数に関係なく今まで通り8進数で指定可能ですね。当たり前ですが)
念のため、bash と expr についても確認してみました。
$ echo $((014-04))
8
$ echo $((14-4))
10
$ expr 014 - 04
10
$ expr 14 - 4
10
$
CentOS6で確認
CentOS6 でも試してみることにします。
環境
名前 | バージョン |
---|---|
CentOS | 6.7 |
tcsh | 6.17.00 |
bash | 4.1.2 |
expr | 8.4 |
環境準備
でも、これだけのためにインストールするのは面倒なので、最近流行の Docker で試してみたいと思います。
とりあえず Docker をインストール。
$ sudo yum -y install docker
$ sudo systemctl start docker.service
$ sudo systemctl enable docker.service
確認結果
Docker のコンテナとして、CentOS6 を実行します。
$ sudo docker run -it centos:6 /bin/sh
(略)
sh-4.1# yum -y install tcsh
(略)
sh-4.1# cat /etc/centos-release
CentOS release 6.7 (Final)
sh-4.1# csh --version
tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec
sh-4.1# csh
[root@133911c01bd7 /bin]# @ var = 014 - 04
[root@133911c01bd7 /bin]# echo $var
8
[root@133911c01bd7 /bin]# @ var = 14 - 4
[root@133911c01bd7 /bin]# echo $var
10
[root@133911c01bd7 /bin]# exit
確かに CentOS 6.7 では、前ゼロ付きは8進数で扱っていますね。
念のため、他のケースも確認しましたが CentOS 7.1 と同じですね。
sh-4.1# echo $((014-04))
8
sh-4.1# echo $((14-4))
10
sh-4.1# expr 014 - 04
10
sh-4.1# expr 14 - 4
10
sh-4.1# exit
後始末
とりあえず、コンテナは削除しておきます。
$ sudo docker rm $(sudo docker ps -aq)
Docker イメージはまだ使うかもしれないので、もう少し残しておこう。
まとめ
RHEL6とRHEL7というよりは、tcsh の 6.17.00 と 6.18.01 で挙動が変わっているんですかね。
とりあえず、ゼロ付きの数字を8進数と10進数のどちらで扱うかのまとめ。
コマンド | RHEL6, CentOS6 | RHEL7, CentOS7 |
---|---|---|
tcsh | 8進数 | 10進数 1 |
bash | 8進数 | 8進数 |
expr | 10進数 | 10進数 |
-
シェル変数parseoctalに何か値を設定すれば8進数として解釈する ↩