簡體   English   中英

如何隱式運行源shell腳本?

[英]How to implicitly run a shell script sourced?

我已經制作了一個shell腳本來作為終端命令運行,但是其中的cd命令無效,因此我想使用source運行它,以便cd命令生效。

腳本名稱: "project.sh"

我將此文件添加到/usr/local/bin ,使其可以通過chmod +x project.sh可執行,並且運行良好,但cd命令無法正常工作。

我知道它在子進程中運行,因此最終終端返回到起始目錄,而project.shcd命令無效。

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

  • 選項1:定義別名alias foo='source "/path/to/foo"'
  • 選項2:定義一個函數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM