如何讓目錄的所有內容都像在 CWD 中一樣執行?
假設我有幾個目錄:
/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 問題有一些您可能會認為適用的想法。