Shell
如何延遲變數的評估(惰性評估)?
例如,我創建了 32768 個名為 0,1,2,…32767 的目錄。
每次執行命令時,我都想隨機選擇一個作為路徑。
所以我
$PATH
改為$PATH:/blabla/$RANDOM
,但它不會工作,因為$RANDOM
會立即評估。如何延遲評估?
這不是任何常見 shell 的功能。
ATT ksh的最新版本在 shell 中具有稱為規則函式的獨特功能。您可以在訪問變數時執行自定義程式碼,如果您設置
.sh.value
為不同的值,則使用該值而不是變數的值。function PATH.get { .sh.value=$PATH:/blabla/$RANDOM; }
但是,即使此功能也無濟於事,
PATH
因為它僅在腳本使用變數時觸發,而不是PATH
在 shell 內部使用時觸發。如果您希望在最後一個 PATH 元素中使用它,並且您正在使用 bash 或 zsh,則可以使用它們的 command-not-found 功能在未找到命令時呼叫自定義程式碼。在 bash 中:
command_not_found_handle () { command "/blabla/$RANDOM/$@" }
在 zsh 中:
command_not_found_handler () { /blabla/$RANDOM/$1 "$@[2,$#]" }
除了這些情況之外,沒有任何 shell 功能可以幫助您。在任何情況下,對於不是由 shell 呼叫的程序,沒有任何 shell 功能可以幫助您。
您可以使用
LD_PRELOAD
覆蓋execlp
,execvp
和execvpe
庫函式來做一些不同的事情,而不是分解PATH
成冒號分隔的部分並將它們中的每一個解釋為一個目錄。有關範例,請參閱 在執行之前重定向文件描述符LD_PRELOAD
。或者,您可以在FUSE文件系統上放置一個 PATH 條目,該文件系統實現了一個堆棧文件系統,使給定的路徑對應於一個變數底層目錄。這將適用於僅
execve
使用每個 PATH 元素呼叫直到一個工作的程序,但它會混淆首先遍歷 PATH 條目以查找現有的執行檔然後執行找到的程序的程序。