2010-08-06 52 views
2

在Linux中,如果我在包含別名的腳本中放入命令,我發現它不會被展開。我該如何解決這個問題?我正在使用bash。腳本中的別名

+0

你能舉個例子嗎?什麼命令?你是如何走樣的? – Cfreak 2010-08-06 14:34:35

+0

你應該使用函數而不是別名。然而GreenMatt的[答案](http://stackoverflow.com/questions/3424725/alias-in-a-script/3424805#3424805)是正確的。 – 2010-08-06 15:45:47

回答

4

根據該TLDP page about aliases,你需要使用線shopt -s expand_aliases在你的代碼擴展的別名。下面的例子產生預期的輸出,但沒有禁用了javascript線只是印有「my_ls:找不到命令」:

#!/bin/bash 

shopt -s expand_aliases 
alias my_ls='ls -lrt' 
echo "Trying my_ls" 
my_ls 
exit 
+0

有趣的是,手冊頁甚至意味着需要shopt,但對於bash 3.2.39它默認打開。 – mvds 2010-08-06 14:47:13

1

如果你希望你的shell別名在腳本中可用,您必須手動包括他們。如果他們在~/.bashrc定義,放線

. ~/.bashrc 

腳本中#!/bin/sh行之後。這將在腳本的上下文中執行.bashrc的內容。

0

啓用POSIX模式(如通過調用bash作爲sh或命令(set -o posix) 2>/dev/null && set -o posix應該做的伎倆。

即使這樣,要知道,別名擴展被解析,並分析和執行之間的次序是不好界定。例如

alias foo=echo; foo bar 

{ 
    alias foo=echo 
    foo bar 
} 

將嘗試運行foo作爲別名尚未在解析時間定義。另外,在執行任何操作之前,一些shell會分析eval.(源)的整個輸入。

所以在腳本中使用別名的唯一便攜和可靠的方法是定義它們,然後eval.使用它們的代碼。