2014-06-05 104 views
3

在Linux系統中定義一個別名非常簡單。如何在shell腳本中創建別名?

從下面的例子中,我們看到的是:I_am_only_ls_alias alias命令給我們的輸出作爲ls命令

# alias I_am_only_ls_alias=ls 
# I_am_only_ls_alias 

輸出:

file file1 

但是,當我試圖做同樣的bash腳本(define alias I_am_only_ls_alias),我得到I_am_only_ls_alias: command not found。我的bash腳本的

例子:

alias_test.bash

#!/bin/bash 

alias I_am_only_ls_alias=ls 

I_am_only_ls_alias 

運行bash腳本 - alias_test.bash

/tmp/alias_test.bash 

輸出:

/tmp/: line 88: I_am_only_ls_alias: command not found 

所以,首先我想問:

爲什麼bash不認識命令I_am_only_ls_alias作爲別名?

爲了在bash腳本中定義別名,我需要做些什麼?可能嗎?

+0

我不認爲別名是由子shell從父shell繼承的。 –

+0

@RSahu:這裏不相關。 –

回答

8

bash手冊頁:

別名沒有擴展的時候shell不是交互,除非expand_aliases外殼選擇是使用shopt設置(參見下shell內建的shopt的 描述命令下 )。

所以這應該工作:

#!/bin/bash 
shopt -s expand_aliases 
alias I_am_only_ls_alias=ls 
I_am_only_ls_alias 

腳本通常使用的功能,而不是別名。

+0

WELL DONE,這就是我想要的 – maihabunash

+0

,你可能不想在腳本中使用別名,NOBODY。 –

+0

對。爲了方便用戶,別名通常是短名稱。 – Barmar

0

別名不能在您執行的shell腳本中定義 - 當shell進程執行完畢後,它們的影響將消失。

但是,您可以在您的~/.bashrc中或在單獨的shell腳本中定義別名,該別名是source(但不是執行!)。在這種情況下,別名將被導入到已經運行的shell進程中,並因此而生存下來並且按照您的預期工作。

+0

他正在嘗試在他定義的腳本中使用別名。 – Barmar

+0

是的,我現在看到了。你的回答是正確的 – mvp

+0

@MVP我認爲Barmar有解決方案 – maihabunash

2

Barmar的答案是包含alias的正確答案,但很可能您會發現Bash function更靈活/有用。

例如,這實質上是一樣的alias版本,但可以更容易地進行擴展:

[email protected]:~/tmp$ cat test.sh 
#!/usr/bin/bash 

function i_am_only_an_ls_func { 
    ls [email protected] 
} 

i_am_only_an_ls_func 
[email protected]:~/tmp$ ./test.sh 
0600871h.html 
[snip] 
[email protected]:~/tmp$ 

[email protected]在這個例子中irrelavent,但它意味着i_am_only_an_ls_func後什麼會後加入ls命令,因爲[email protected],$1,$2等包含該函數的參數,與普通腳本非常相似。 (注意,$0仍然是腳本的名字不是函數)