如何讓目錄的所有內容像在 CWD 中一樣運作?

如何讓目錄的所有內容像在 CWD 中一樣運作?

假設我有幾個目錄:

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

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

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

答案1

這聽起來應該修復 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 問題有一些您可能會發現適用的想法。

相關內容