
假設我有幾個目錄:
/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
.
答案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 問題有一些您可能會發現適用的想法。