
所以這個截圖基本上解釋了它
https://gyazo.com/1a9d621efa28c7994c3a2afbe0411a2b
我設定了一些別名,用於在終端中打開一個新選項卡,並執行其他操作,甚至是用於運行調試 shell 腳本的別名,但該debug.sh
腳本只是使用別名newtab
來嘗試打開一個新選項卡,這僅在.sh 或任何其他可執行檔中鍵入時有效newtab
,但它不起作用,任何其他別名也不起作用,我該如何解決此問題?
我注意到的一件事是,我將所有的export
' 和alias
' 放入/etc/bashrc
and not~/.bash_profile
或其他中,而且我幾乎沒有/etc/bashrc
在任何地方看到提及
我做對了嗎?
答案1
別名擴展僅從互動式 shell 中完成,而不是在腳本內debug
完成,因此擴展為newtab
,但newtab
本身不擴展,因為它是從腳本呼叫的。
如果您使用匯出函數而不是別名,它將起作用:-
debug() { $scripts/debug.sh; }; export -f debug
...
newtab() { $scripts/newtab.osx.sh; }; export -f newtab
導出是必要的,因為腳本在子 shell 中運行,儘管對於您引用的特定實例,它只newtab
需要是一個函數。
函數可以代替別名隨處使用,但可以做更多的事情,例如在運行字串的末尾添加一個額外的參數,這是別名無法做到的一個非常簡單的要求。事實上,它們可以做腳本能做的任何事情,但與它們在當前 shell 中運行的腳本不同,因此它們可以改變環境和當前目錄,為此腳本需要.
或source
命令來實現。