2012-06-21 30 views
3

首先,我想糾正我的詞彙量。我假設終端爲bash提供了一個環境,它是shell的一個類型/版本。它是否正確?保存bash函數

我試圖在開發過程中更多地使用bash和shell來加速部署。但是,我只是開始理解我從成長中學到的命令之外的基礎知識。

我已經開始在終端中製作功能來幫助自動執行一些更重複的任務。直到我退出終端,這都是尋找和花花公子。

我假設shell運行在一個實例中,以便當我退出終端時實例丟失。我注意到shell離開了一個.bash_history,也可以使用'history'訪問,在那裏我可以看到舊會話中的舊函數。但是,當然,他們似乎不再執行。

我認識到我可以創建一個shell腳本,但是這會引入編譯問題以及不得不更多地關注腳本相對存儲的位置。

問題:當我使用command(){}創建bash腳本時,它們在關閉終端後不會保留。我可以讓他們在新的終端會話中這樣做,我可以訪問我的舊功能而不訴諸shell腳本?


編輯:我也想提一提,我想廣泛地發現一個問題這個用傳統的手段,但「拯救」,並在搜索術語「退出」往往會直接到外殼的其他方面。

+0

不完全。 「終端」是將屏幕輸出的文本轉換爲屏幕上的像素,並將鍵盤按壓轉換爲進入外殼的文本的程序。這個問題全是關於shell,而不是終端。我會適當地保留它。 – LeoNerd

回答

1

您的第一條陳述是正確的。終端實例運行一種類型的shell(bash,sh,csh)

您可以將它們添加到〜/ .bashrc文件或將保存的腳本路徑(無需編譯)添加到PATH變量中。

您也可以將腳本複製到/ usr/local/bin以便隨時快速訪問。你不需要跟蹤他們相對的位置。這是非常方便的,並使您的腳本可供其他用戶使用(或者,如果權限設置正確,則不會)

2

查看Bash參考手冊的Using History Interactively部分,瞭解如何從歷史記錄中執行命令。

例如,輸入!?foo並按輸入將執行包含「foo」的最新命令。我喜歡在我的~/.bashrc中有shopt -s histverify histreedit,這樣我可以編輯並確認該命令,如有必要,而不是立即執行。

另請參閱Commands For Manipulating The History部分的擊鍵,您可以使用該按鍵搜索歷史條目以進行調用和執行。

例如,按下Ctrl鍵 - - [R並鍵入foo會記得含有 「foo」 的最近的命令。您可以按Ctrl - r附加時間繼續搜索相反的附加匹配命令。按輸入當您準備執行當前顯示的或Ctrl - g中止搜索。

如果添加stty -ixon~/.bashrc,那麼你可以使用Ctrl鍵 - 小號你已經開始向後搜索後,通過歷史向前搜索。

當然,您可以通過編輯~/.bashrc並添加它們來保存您的功能。我更喜歡將我的函數保存在我創建的名爲~/bin/functions的文件中,然後添加一行到~/.bashrc以獲取該文件。該行看起來像. ~/bin/functions

我在/usr/local/bin~/bin中保存較大的腳本。前者應該已經在你的路徑中,你可以通過編輯~/.bashrc將後者添加到你的路徑。

1

在命令行中輸入函數後,您可以使用命令行編輯來回憶它們(如@Dennis Williamson所述),但有一種更簡單的方法:declare -f。此命令可以列出當前所有的功能,你可以將它們重定向到一個文件:

home/user1> function myfunc { 
> echo "Hollow world!" 
> } 

/home/user1> declare -f > myfuncs 
/home/user1> more myfuncs 
myfunc() 
{ 
    echo "Hollow world" 
} 

注猛砸如何改變從科恩函數語法殼Bourne shell的!幸運的是,Bash中的兩者沒有區別(與ksh93不同)。

當你需要加載功能,這是一個簡單的問題:

/home/user1> source myfuncs 
/home/user1> myfunc 
Hollow world! 

你不需要的方式執行權限,只讀。 您可以(如其他人所說)將其添加到您的一個啓動文件中,如.bashrc