顯示具有 Script 標籤的文章。 顯示所有文章
顯示具有 Script 標籤的文章。 顯示所有文章

2013年3月4日 星期一

關於 Bash 的 Redirection 使用的心得

一般常見的方式是把標準輸出 (stdout) 訊息跟標準錯誤 (stderr) 訊息全部都導進一個檔案裡面,例如以下指令:

$ sudo fdisk -l >fdisk.log 2>&1

如果是寫在一個 Shell Script 的檔案裡面,就可以寫成像是下面這樣:

#!/bin/sh

exec >fdisk.log # 0 (stdin) 1 (fdisk.log) 2 (stderr)
exec 2>&1       # 0 (stdin) 1 (fdisk.log) 2 (fdisk.log)

sudo fdisk -l

但是其實我們也可以使用更複雜的 Redirection,從 bash need STDOUT+STDERR in log, and STDERR to its normal destination 改出來的例子:

$ ((sudo fdisk -l 3>&1 1>&2 2>&3- | tee /dev/fd/2) 3>&1 1>&2 2>&3-) | cat >fdisk.log

這個例子的結果是將標準輸出訊息跟標準錯誤訊息都導進 fdisk.log 裡面,然後將標準錯誤訊息顯示出來。

但是它做了什麼事情?

首先是

sudo fdisk -l 3>&1 1>&2 2>&3-

如果直接用 Shell Script 檔案來寫,會看起來像是這樣:

#!/bin/sh

exec 3>&1  # 0 (stdin) 1 (stdout) 2 (stderr) 3 (stdout)
exec 1>&2  # 0 (stdin) 1 (stderr) 2 (stderr) 3 (stdout)
exec 2>&3- # 0 (stdin) 1 (stderr) 2 (stdout) 3 (closed)

sudo fdisk -l

看起來像是

`sudo fdisk -l` --> stdout ` '-> stdout
                |           X
                `-> stderr ' `-> stderr

它將標準輸出訊息跟標準錯誤訊息互換了,接下來

| tee /dev/fd/2
會收到 pipe 符號前面傳來的標準輸出訊息也就是 `sudo fdisk -l` 的 2 (stdout) 會變成 `tee` 的 0 (stdin),然後 `tee` 會將其內容導到 `tee` 的 2 (stderr) 並且顯示在 `tee` 的 1 (stdout) 於是乎 `sudo fdisk -l` 的標準輸出訊息跟標準錯誤訊息都會被導到 stderr 而標準錯誤訊息則被導到 stdout

看起來像是

                                       `tee`
`sudo fdisk -l` --> stdout ` '-> stdout --> stdout
                |           X           `-> stderr
                `-> stderr ' `-> stderr

接下來再經歷一次的標準輸出訊息跟標準錯誤訊息互換

((...) 3>&1 1>&2 2>&3-)

看起來像是

                                       `tee`
`sudo fdisk -l` --> stdout    -> stdout --> stdout ` '-> stdout
                |          ` '          |           X
                |           X           `-> stderr ' `-> stderr
                `-> stderr ' `-> stderr --> stdout

從最後一張圖就可以看出最後的兩個 stdout 分別來自於 `sudo fdisk -l` 的 stdout 跟 stderr 而最後的一個 stderr 還是來自於 `sudo fdisk -l` 的 stderr

最後一步就是透過 `| cat >fdisk.log` 將兩個 stdout 都導進 fdisk.log 檔案就大功告成啦!:D

2008年1月26日 星期六

bash: alarmRun

命令列下的指令真的很好玩
把幾個小指令組合起來就可以很容易達到某些功能了~ :P
#!/bin/sh

declare -i alarm_time=$(date -d "$(date +%D) $1" +%s)
declare -i now_time=$(date +%s)

if [ $alarm_time -le $now_time ]; then
alarm_time=$alarm_time+60*60*24
fi

until [ $now_time -ge $alarm_time ]; do
sleep 1
now_time=$(date +%s)
echo -en "\r現在是 $(date +%T) 鬧鐘設定在 $1"
done

shift

$*

把這樣的檔案存成 alarmRun 在給予 chmod +x alarmRun
這樣就可以
./alarmRun 07:00:00 mplayer alarm.mp3

在早上七點當鬧鐘使用了~ :D

2007年12月7日 星期五

hiChannel 命令列點播器 v1.1.0

之前的 hiChannel.sh v1.0.0 是用很爛的結構硬刻出來的
昨天把 hiChannel.sh 改到 v1.1.0
整個結構變得比較有組織而且容易維護
而且可以選擇自己喜歡用的多媒體播放器
只要編輯該檔案最前面的部份

function media_player ()
{
#totem $1
#mplayer $1
gst-launch playbin uri=$1
}

看自己喜歡用哪個就把哪個打開其他的就 mark 掉
--
P.S. 另外~ 我在猜~ 如果知道 Mac OS X 怎麼使用命令列方式呼叫 QuickTime 的話~ 應該也是可以直接使用的~ 只是我不知道要怎麼在 Mac OS X 使用命令列呼叫 QuickTime~ 囧rz

2007年11月26日 星期一

hiChannel 命令列點播器

一時興起就忍不住寫了 hiChannel 命令列點播器 .... >_<
也是利用 GStreamer 來當播放引擎
所以還是要裝一堆有的沒有的才可以使用
如果是 Debian/Ubuntu 的話就裝上

$ sudo aptitude install gstreamer-tools gstreamer0.10-plugins-base gstreamer0.10-plugins-bad gstreamer0.10-plugins-ugly gstreamer0.10-ffmpeg gstreamer0.10-alsa

如果是 Fedora 的話就增加 http://rpm.livna.org
然後裝上

# yum install gstreamer-tools gstreamer-plugins-bad gstreamer-plugins-ugly gstreamer-ffmpeg

最後當然是下載點囉~ ^o^

http://fd.idv.tw/tux/hiChannel.sh

2007年11月18日 星期日

BetaRadio 的編譯安裝指引

因為自從換了一個新工作後可以自由地選擇使用自己喜歡的 Linux Distribution ^_^
所以我已經不太使用 Debian/Ubuntu 以外的 Linux Distribution 了
因此對於 Debian/Ubuntu 平台以外的使用者只能說聲抱歉了
沒有辦法製作你/妳們喜歡的 Linux Distribution 上面的 Binary Package
同時我是個追求新版本的怪咖,所以像是 Ubuntu 套件只包給 7.10
因為我也沒有 Ubuntu 7.10 以外的環境... ^^|
不過還是有熱心的 swyear 兄幫忙打包了給 openSUSE 10.3 用的套件 Betaradio 0.1.1 for openSUSE 10.3
另外如果你/妳們只想要在 Command Line 下不想要那麼複雜的套件相依性
我推薦你/妳們去使用 champ 兄寫的 Script Hinet radio script 20071112
或者是 pcman 的大作 Hinedo GUI 介面也是不需要複雜的套件相依性
不過因為還是有網友有在詢問要怎麼編譯安裝
所以我特地寫了一份編譯安裝指引文件在 InstallationFromSourceCode
給 Debian/Ubuntu & Fedora 6/7/8 的使用環境編譯