bash と tcsh の違いに混乱する(笑)ので、まとめてみる。


historyコマンドのカスタマイズ

tcsh

set history= ( 1000 "%h %Y/%W/%D %T %R\n" )

bash

export HISTTIMEFORMAT='%F %T '

ファイルに残したくない場合はそれぞれ unset savehist, unset HISTFILE。

tcsh で月を表すのがなぜ %W なのかはよくわかってない。bash は strftime にわたると書いてある。

参考文献: historyコマンドに日付を加える


環境変数が存在するかどうかの判定

csh

if ($?SSH_TTY) then
  hogeratta
else
  bakeratta
endif

参考文献: http://okwave.jp/qa/q5459175.html

sh

-n は -z でも可。その場合は条件が反転する。

if [ -n "$SSH_TTY" ]; thrn
  hogeratta
else
  bakeratta
fi

返り値

sh
$?
csh
$status

if文

sh

if test "x$1" = "x";
then
    echo "argv #1 is null"
else
    echo "argv #1 is not null"
fi

x をつけているのは、$1 が空だと test = "" となり、"unexpected operator" と怒られてしまうため。ぶっちゃけ、空文字列にならなければ何でもいい。

DAY=`/bin/date +%d
if test $DAY -le 15;
then
    echo "First half of the month"
else
    echo "Second half of the month"
fi
if test $DAY -le 10; then
    echo "First third of the month"
elif test $DAY -le 20; then
    echo "Second third of the month"
else
    echo "Last third of the month"
fi

条件文の後ろに ";" を入れることで、if と then を1行にまとめることもできる。

if [ -s file2test ]; then
    echo "file2test is not empty"
else
    echo "file2test is empty file"
fi
if [ ! -s file2test ]; then
    echo "file2test is empty"
fi

csh

if ($1 == "") then
    echo "argv #1 is null"
else
    echo "argv #1 is not null"
endif
if (`/bin/date +%d` < 15) then
    echo "First half of the month"
else
    echo "Second half of the month"
endif
if (`/bin/date +%d` < 10) then
    echo "First third of the month"
else if (`/bin/date +%d` < 20) then
    echo "Second third of the month"
else
    echo "Last third of the month"
endif

Redirect

bash

bash の 2>&1 は、stderr の出力を stdout と同じにするの意味だが、適用順序に注意。3番目の例では、strerr のみが stdout に出力され、stdout そのものは file_from_stdout に出力される

tcsh

tcsh には、bash の最初の例のように、stdout と stderr を別々のファイルに書き出す方法はないらしい…


シェル変数・環境変数の設定方法

bash

tcsh


Copyright © 2013 Yuuichirou Oka, oka AT a-f DOT jp
All Rights Reserved. International Copyright Secured.