[英]How to implicitly run a shell script sourced?
我已經制作了一個shell腳本來作為終端命令運行,但是其中的cd
命令無效,因此我想使用source
運行它,以便cd
命令生效。
腳本名稱: "project.sh"
我將此文件添加到/usr/local/bin
,使其可以通過chmod +x project.sh
可執行,並且運行良好,但cd
命令無法正常工作。
我知道它在子進程中運行,因此最終終端返回到起始目錄,而project.sh
的cd
命令無效。
Sol:1提出的解決方案對我不起作用,因為它們要求我運行source <file>
,如果我想將其用作Bash命令,則不可能。
您使用source
命令:
source /usr/local/bin/project.sh
不能通過鍵入腳本名稱自動執行此操作,該腳本名稱始終在子進程中運行腳本。 如果您不想全部輸入,可以在.bashrc
創建一個別名來簡化它:
alias project='source /usr/local/bin/project.sh'
然后鍵入project
將轉換為該完整命令。
當然, source <file>
是 Bash命令-它使用內置 source
在當前 shell的上下文中而不是在子進程中運行腳本<file>
,因此允許<file>
命令更改當前shell的環境,例如在工作目錄方面(使用cd
)。
使用source
或其別名.
,(最終)是實現該目標的唯一方法。
如果您的目的不是要使用source
顯式調用<script>
,則有兩個選項, 最好在Bash配置文件中定義~/.bash_profile
(因為您使用的是OS X;在Linux上,請使用~/.bashrc
[1] ):
我假設你的腳本/path/to/foo
,並且要調用它的來源只是foo
:
alias foo='source "/path/to/foo"'
foo() { source "/path/to/foo"; }
foo() { source "/path/to/foo"; }
這兩個別名和函數在執行當前的外殼,讓您有效地隱藏 source
單個命令后面調用; 別名通常更容易定義,但是函數提供了更大的靈活性。
由於在Bash配置文件中定義了別名/函數,而別名/函數本身是隱式來源的 ,因此/path/to/foo
的命令將影響交互式shell的環境。
注意 : foo
任何一種定義都只能在交互式外殼程序((自動)源~/.bash_profile
外殼程序中)中使用。 為了使foo
在非源代碼腳本中也可以工作,還需要采取其他步驟,但是在那一刻,您應該問自己是否不使/path/to/foo
成為顯式源 ,從而使事情變得晦澀 。
如果您要編寫一個腳本,必須將該腳本作為來源分發給他人 :
在用戶的殼輪廓/初始化文件安裝采購指令上安裝你的腳本(如上所述)。
i
(-- --install
),以按需執行此安裝。 無論哪種方式,都應在腳本中構建邏輯,以使其在不進行采購的情況下拒絕運行,並讓錯誤消息包含有關如何安裝采購的說明。
我的typex實用程序是上述示例的實際實現(盡管由於使用多殼而更加復雜)。 源代碼在這里 。
[1]在OS X上 ,由Terminal.app啟動的Bash實例是登錄外殼,這意味着啟動時自動生成的唯一(特定於用戶的)文件是~/.bash_profile
。
相比之下,在大多數Linux系統上,Bash實例是非登錄shell,其中僅~/.bashrc
是自動來源的。
雖然通常從一個人的~/.bash_profile
~/.bashrc
,但是必須手動配置它,因此不能盲目地依賴它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.