#!的真正意義及其妙用(附帶簡單的自解壓腳本header)

在一個Linux腳本中的第一行寫上“#! COMMAND_INTERPRETER” ,然後把文件權限加上執行,就可以直接執行這個文件。事實上,在這個過程中,系統先啓動COMMAND_INTERPRETER,然後將所有內容作爲標準輸入輸入這個程序,僅此而已

例如這個腳本,將啓動/bin/bash,接着bash將從標準輸入讀取到接下來兩所有命令,並執行。
#!/bin/bash

export LANG
=en
VSEXEC
=/opt/slickedit/bin/vs
unset XMODIFIERS
$VSEXEC $@

1. #!之後的內容,可以複雜點的命令行(不過似乎只能是一個參數,所有的內容都將被識別爲第一個參數,多了會被“特別”處理)。只要執行後能夠啓動命令解釋器的,都行。例如:
stlxv@stlxvcomputer:~/tmp$ cat /usr/share/doc/lua5.1-doc/examples/debian/script/hello 
#!/usr/bin/env lua5.1

print 'hello from Lua'

2. #!行之後的內容,將作爲標準輸入輸入到#!所啓動的程序。這個程序可以是任意的程序,這也意味着任何語言都可以當成腳本來用。同時,這也意味着不是腳本執行完成之後,程序就一定會退出。例如下面這個用LOGO語言編寫的腳本,最後一行加了bye命令來退出ucblogo,如果沒有這個bye,那麼ucblogo將會繼續執行而不是退出。
#!/usr/bin/ucblogo

:s - 最底邊邊長
:l - 角1
:r - 角2
:dl - 左邊的遞減倍數
:dr - 右邊的遞減倍數
to b_tree 
:::::dl :dr
if :n=0 [stop]
fd 
:s lt :l
b_tree 
:n-1 :s*:dl :::dl :dr
rt 
:l+:r
b_tree 
:n-1 :s*:dr :::dl :dr
lt 
:r bk :s
end

ht pu bk 
200 pd 
pr [enter a 
number(n>0): ]
make 
"x rl
b_tree first :x 100 20 20 0.7 0.9
pr [ press any key to exit... ]
make 
"x rl
bye

3. 可以很簡單地製作一個header,然後附加各種數據。例如將上面的解釋器改成#!/bin/cat之後,運行結果如下:
stlxv@stlxvcomputer:~/tmp$ ./b_tree 
#!/bin/cat

:s - 最底邊邊長
:l - 角1
:r - 角2
:dl - 左邊的遞減倍數
:dr - 右邊的遞減倍數
to b_tree 
:::::dl :dr
if :n=0 [stop]
fd 
:s lt :l
b_tree 
:n-1 :s*:dl :::dl :dr
rt 
:l+:r
b_tree 
:n-1 :s*:dr :::dl :dr
lt 
:r bk :s
end

ht pu bk 
200 pd 
pr [enter a 
number(n>0): ]
make 
"x rl
b_tree first :x 100 20 20 0.7 0.9
pr [ press any key to exit... ]
make 
"x rl
bye

注意:我曾嘗試直接套用tar來製作自解壓,但由於第一行也會被輸入,所以是不可以的。但是由於#!的格式太過簡單,不支持複雜的命令行,所以,最好的方法還是自己寫一個完整的腳本來製作自解壓。這裏是一個簡單的自解壓header,用來爲.tar.bz2創建自解壓文件。使用方法如下:
cat XXX.header XXX.tar.bz2 > XXX.self-extractor
chmod +x XXX.self-extractor

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章