Shell

如何讓目錄的所有內容都像在 CWD 中一樣執行?

  • May 24, 2021

假設我有幾個目錄:

/Users/user1/ApplicationThing/
/Users/user1/Documents/
/Users/user1/other/directory/it/doesnt/matter/

假設有一個文件main.sh.../ApplicationThing/它也依賴於另一個文件dependancy.sh

我希望能夠在任何其他目錄中,並且能夠執行main.sh,它的 WD 作為我的 CWD,就好像內容.../ApplicationThing/目錄在系統上的每個其他目錄中一樣。不像 with $PATH,而是好像內容實際上在目錄中,但不應該在自動完成甚至ls -l.

這聽起來應該修復 ApplicationThing 以從特定位置查找其依賴項,即使使用不同的工作目錄呼叫也是如此。

您可以通過設置環境變數來做到這一點:

export ApplicationThingHome=/Users/user1/ApplicantionThing

並引用main.sh使用該變數的值的所有依賴項(如果變數未設置,則可以選擇一個不錯的預設值),例如

${ApplicationThingHome:-/usr/local/ApplicationThingDefaultDir}/dependancy.sh

代替

./dependancy.sh

然後,您可以將main.sh’ 目錄放入$PATH並從任何目錄中使用它。

您提出的解決方案會有一個問題:如果您在任何其他目錄中並希望創建一個名為的文件,比如說,main.sh或者dependency.sh那裡,您最終會覆蓋 ApplicationThing 的相應文件。main.sh除了屬於 ApplicationThing 的那個之外,您實際上將無法擁有/使用任何其他的……並且目錄的發明正是為了避免這樣的問題!

當然,您可以將“偽文件”設置為僅在第一次執行時才存在的條件main.sh……但是您將需要另一組工具來查看main.sh看到的內容,以便在它不執行時對其進行故障排除你所期望的。

如果您無法修復 ApplicationThing,您可以製作一個包裝腳本以從系統上的任何位置呼叫 ApplicationThing,並將腳本放在 $PATH 中包含的目錄中:

#!/bin/sh
# set the correct working directory for silly ApplicationThing
cd /Users/user1/ApplicationThing
# if ApplicationThing has any other environment requirements, 
# this would be a great place to ensure they're satisfied too.

# Now execute the main.sh of ApplicationThing, giving it any 
# command line arguments that were given to this script, exactly as-is.
exec ./main.sh "$@"

由於此腳本將作為單獨的程序執行,cd因此腳本中的命令根本不會影響呼叫腳本的會話。執行中的exec關鍵字main.sh避免在呼叫 shell 和main.sh.

使用這種方法,如果main.sh將文件名作為參數,則必須將它們作為絕對路徑名提供,因為任何相對路徑名都將被解釋main.sh為相對於 ApplicationThing 的目錄,而不是相對於呼叫會話的 CWD。

如果這是一個問題,您可以在將命令行參數傳遞給main.sh. 這個 StackExchange 問題有一些您可能會認為適用的想法。

引用自:https://unix.stackexchange.com/questions/651081