2018年1月12日金曜日

bashのhistory設定

コマンド実行時刻を bash の history で確認したい場合があり、少し設定を行っているのですが、忘れてしまうので備忘録。
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
 . /etc/bashrc
fi

unset HISTCONTROL
HISTSIZE=20000
HISTTIMEFORMAT=" %F %T  "
このように .bashrc に設定しています。20000という数字は経験値で、10000では足りなかった経験があるため、倍の値を採用しています。
[root@hoge ~]# history
...
 1210   2018-01-13 18:19:49  history
[root@hoge ~]# 

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
...
なぜ、こうしたいのか? 標準エラーではダメなのか? と思われるかもしれませんが、世の中いろいろありますね。
ちょっと、ここには書けませんが。
人気ブログランキングへ にほんブログ村 IT技術ブログへ