2013年12月24日 星期二

cron 的一些.. run as XXX 還有環境

cron 是定時執行的 daemon。
命令是在; /etc/crontab
在crontab 中可以指定以哪一個 user 的身份來 run command
但是並不包含該 user 環境變數。

所以 run 起來會和真的以該user run 該 script 的結果不同。

為了解決這個問題,
可以在 command script 的開頭加入: . .profile

test result . 判斷執行成功或失敗

在 shell script 中,需要知道這個 command 執行成功或失敗。
$?
來代表

例如: cd mydir if [ "$?" -ne "0" ]; then echo failed else echo success fi
0 代表成功。



另外,有要用 pipe log ,又要判斷的情況。
例如: make -j4 2>&1 | tee makelog 這時候用 $? 就會是 tee 這個 command 執行的結果,不是 make 的

在bash, 可以用 ${PIPESTATUS[0]} 來代表 make -j4 2>&1 | tee makelog if [ "${PIPESTATUS[0]}" -ne "0" ]; then echo failed else echo success fi

2013年1月3日 星期四

sed -- 取出 pattern 中的某個部份

例如:從 XML 檔中取出某 tag 的值。
<name>Charles</name> <id>123</id> <color>red</color> ...

用 sed 來操作,就是...
  • 找到 符合 pattern 的地方
  • 印出 pattern 的某個部份

以上面的例子,xml tag 的 pattern 和 value就是: <.*> \(.*\) <\/.*>
前後被 tag 包起來,中間的部份要留下來 \(.*\)

把這個放到 sed 控制字串中: sed 's/ <.*>\(.*\)<\/.*> / \1 /' file 一樣用 s 指令。
最後用 \1 代表 pattern 中,第一個 \(.*\) 的內容。

這樣所有的 tag 都會被取出。
如果只是要某個 tag,例如 : id。
就可以把 id 寫入 pattern 中: sed 's/ <id>\(.*\)<\/id> / \1 /' file