2017-01-10 32 views
1

我在Ubuntu工作,並使用bash shell的禁用了javascript並不外殼函數內部工作

我試圖執行「別名」,如下圖所示,但它不工作

當我嘗試「禁用了javascript -s expanded_aliases ; source env.sh; HAL-ON」功能外它的工作原理,但在函數內部它不工作

do_build() 
{ 
source env.sh 

shopt -s expand_aliases 

hal-on 
} 

# Main 
do_build 

錯誤消息

  • HAL-上 ./temp:第10行:HAL-上:找不到命令

我在做什麼錯?

+0

可能重複的[使店鋪更改本地功能](http://stackoverflow.com/questions/12179633/make-shopt-change-local-to-function) –

+0

@IporSircer這似乎不是一個明顯的重複 - 事實上,它提出的問題恰恰相反 - 儘管我認爲接受的答案也可能是一個合適的解決方法。 – tripleee

+0

首先使用別名是最明顯的事情,你可以做不同的事情。如果可以的話,我會毫不猶豫地將它稱爲「出錯」,但有許多其他原因可以避免出現別名。 – tripleee

回答

0

別名在bash中有奇怪的行爲,使用函數幾乎總是更好。你的例子中有什麼可能是一個函數中的別名的定義,我不知道那裏發生了什麼。另外,在一個函數內源文件是很少見的,也是有問題的,除非它只是一堆變量集合。事實上,除非你明確地聲明變量是「本地」的,否則在外面做源代碼幾乎沒有什麼區別。

我可以看到,您可能處於的一種情況是僅在特定條件下執行環境中定義的事情。如果你的變量集很複雜,我可以看到你不想這樣做。但真正限制它變量集...沒有函數/別名定義。

閱讀bash手冊頁中的別名。搜索「別名不擴展」。它與「別名在讀取時擴展」有關。通過一些實驗,即使在函數定義之前設置了shopt,別名也不會在函數內擴展。

所以...使用函數來代替。

alias foo="bar baz"變成foo(){ bar baz "[email protected]" ;}並且通常以相同的方式操作。

相關問題