2017年12月15日金曜日

bashスクリプトの if 文で ==

自作 bash スクリプトの if 文で、== で書いてしまっていた箇所があり、間違いではないか(正しく動作していないのでは?)という疑念を持ち調べたところ、bash の [ ] の中では、== も受け付けてくれると知りました。でもまあ、疑惑のタネになると思うので、旧来のBシェルの記述に従って == の箇所は = に直しました。
man bash より抜粋。
...
       string1 == string2
       string1 = string2
              True if the strings are equal.  = should be used with the test command for POSIX conformance.
...
bash 組み込みの help だと、man のような記述はありませんでした。
[root@hoge ~]# help test
test: test [expr]
    Evaluate conditional expression.
...

      -n STRING
         STRING      True if string is not empty.
    
      STRING1 = STRING2
                     True if the strings are equal.
      STRING1 != STRING2
                     True if the strings are not equal.
...
なお、test コマンド(bash 組み込みではないほう)の man だと記述はありませんが、== も受け付けるようです。
...
       -z STRING
              the length of STRING is zero

       STRING1 = STRING2
              the strings are equal

       STRING1 != STRING2
...
[root@hoge ~]# /usr/bin/test "a" == "b" ; echo $?
1
[root@hoge ~]# /usr/bin/test "a" == "a" ; echo $?
0
[root@hoge ~]# /usr/bin/[ "a" == "a" ] ; echo $?
0
[root@hoge ~]# /usr/bin/[ "a" == "b" ] ; echo $?
1
[root@hoge ~]# ls -li /usr/bin/test /usr/bin/[
2296639 -rwxr-xr-x. 1 root root 41496 Nov  6  2016 /usr/bin/[
2296722 -rwxr-xr-x. 1 root root 37328 Nov  6  2016 /usr/bin/test
[root@hoge ~]# rpm -qlv coreutils | egrep "/usr/bin/(\[|test)"
-rwxr-xr-x    1 root    root                    41496 Nov  6  2016 /usr/bin/[
-rwxr-xr-x    1 root    root                    37328 Nov  6  2016 /usr/bin/test
ちなみに、/usr/bin/test と /usr/bin/[ の実体は同じかと思ってたのですが、ls -li の結果は食い違ってました。いったい何なんだろう。環境は CentOS7 。

2017年12月9日土曜日

シェルスクリプトで端末から実行された場合だけメッセージを出したい

とあるシェルスクリプトを書いていて、端末から実行された場合だけメッセージを出したいと思いました。
tty コマンドで制御端末があるかどうか確認してから、/dev/tty へ書き込めば良いものとは思いましたが、ネット上に用例がないか調べたところ、ありました。AIX ではありますが。。
https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_71/com.ibm.aix.cmds5/tty.htm
これを参考に、次のようなコードを書きました。
...
if [ $? -ne 0 ] && tty -s ; then
        echo "..." >/dev/tty
fi
...
なぜ、こうしたいのか? 標準エラーではダメなのか? と思われるかもしれませんが、世の中いろいろありますね。
ちょっと、ここには書けませんが。

2017年12月2日土曜日

CentOS7 で TrackPoint が重い(ThinkPad X300 の場合)

今も動く ThinkPad のうちで最古の X300 では、前に書いた方法では、TrackPoint の調整ができませんでした。sysfs の sensivity などのエントリーが無いです。
[root@hoge ~]# find /sys | grep sensivity
[root@hoge ~]# 
しかし、マルチブートの Windows では調整できるのであるから、何か方法があるものとネットを彷徨った結果。下記の「Device Accel Adaptive Deceleration」の値を調整すればよいことがわかりました。
root@hoge ~]# xinput list
⎡ Virtual core pointer                     id=2 [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
⎜   ↳ DualPoint Stick                          id=11 [slave  pointer  (2)]
⎜   ↳ AlpsPS/2 ALPS DualPoint TouchPad         id=12 [slave  pointer  (2)]
⎣ Virtual core keyboard                    id=3 [master keyboard (2)]
    ↳ Virtual core XTEST keyboard              id=5 [slave  keyboard (3)]
    ↳ Power Button                             id=6 [slave  keyboard (3)]
    ↳ Video Bus                                id=7 [slave  keyboard (3)]
    ↳ Sleep Button                             id=8 [slave  keyboard (3)]
    ↳ UVC Camera (17ef:4807)                   id=9 [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard             id=10 [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                   id=13 [slave  keyboard (3)]
[root@hoge ~]# xinput list-props 11
Device 'DualPoint Stick':
 Device Enabled (127): 1
 Coordinate Transformation Matrix (129): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
 Device Accel Profile (254): 0
 Device Accel Constant Deceleration (255): 1.000000
 Device Accel Adaptive Deceleration (256): 1.000000
 Device Accel Velocity Scaling (257): 10.000000
 Device Product ID (250): 2, 8
 Device Node (251): "/dev/input/event5"
 Evdev Axis Inversion (258): 0, 0
 Evdev Axes Swap (260): 0
 Axis Labels (261): "Rel X" (137), "Rel Y" (138)
 Button Labels (262): "Button Left" (130), "Button Middle" (131), "Button Right" (132), "Button Wheel Up" (133), "Button Wheel Down" (134), "Button Horiz Wheel Left" (135), "Button Horiz Wheel Right" (136)
 Evdev Scrolling Distance (263): 0, 0, 0
 Evdev Middle Button Emulation (264): 1
 Evdev Middle Button Timeout (265): 50
 Evdev Middle Button Button (266): 2
 Evdev Third Button Emulation (267): 0
 Evdev Third Button Emulation Timeout (268): 1000
 Evdev Third Button Emulation Button (269): 3
 Evdev Third Button Emulation Threshold (270): 20
 Evdev Wheel Emulation (271): 1
 Evdev Wheel Emulation Axes (272): 6, 7, 4, 5
 Evdev Wheel Emulation Inertia (273): 10
 Evdev Wheel Emulation Timeout (274): 200
 Evdev Wheel Emulation Button (275): 2
 Evdev Drag Lock Buttons (276): 0
整数しか指定できないと勘違いして、しばらく格闘してしまいましたが、実は小数も指定でき、0.4 くらいにすると、マシになりました。
[root@hoge ~]# xinput set-float-prop "DualPoint Stick" "Device Accel Constant Deceleration" 0.4
ちなみに、X300 で CentOS7 は、いちおう使えるレベルです。さすがに GNOME が重めで、CPU のパワー不足を顕著に感じます。
でも、このマシンは液晶ディスプレイの発色が良くて、キーボードが打ちやすいです。
最近、ThinkPad 25 を入手したので、新旧のキーボードを使い較べています。ThinkPad 25 については、そのうちにレビューしてみようと思っています。
人気ブログランキングへ にほんブログ村 IT技術ブログへ