예를 들어, 0,1,2,...32767이라는 이름의 32768개 디렉터리를 만들었습니다.
명령을 실행할 때마다 경로를 무작위로 선택하고 싶습니다.
$PATH
그래서 으로 바꿨 는데 바로 평가가 되니까 $PATH:/blabla/$RANDOM
작동이 안 되더라구요 .$RANDOM
평가를 어떻게 지연할 수 있나요?
답변1
이것은 일반적인 쉘의 기능이 아닙니다.
최신 버전ATT 크쉬셸에는 규율 함수라는 고유한 기능이 있습니다. 변수에 액세스할 때 사용자 정의 코드를 실행할 수 있으며, .sh.value
다른 값으로 설정된 경우 변수 값 대신 해당 값을 사용할 수 있습니다.
function PATH.get { .sh.value=$PATH:/blabla/$RANDOM; }
그러나 이 기능도 변수가 셸 내부에서 사용될 때가 PATH
아니라 스크립트에서 변수가 사용될 때만 트리거되기 때문에 도움이 되지 않습니다 .PATH
마지막 PATH 요소를 이와 같이 만들고 bash 또는 zsh를 사용하는 경우 "명령을 찾을 수 없음" 기능을 사용하여 명령을 찾을 수 없을 때 사용자 정의 코드를 호출할 수 있습니다. 배쉬에서:
command_not_found_handle () {
command "/blabla/$RANDOM/$@"
}
zsh에서:
command_not_found_handler () {
/blabla/$RANDOM/$1 "$@[2,$#]"
}
이러한 경우 외에는 어떤 쉘 기능도 도움이 될 수 없습니다. 어떤 경우에도 쉘에서 호출되지 않은 프로그램에는 쉘 기능이 도움이 될 수 없습니다.
당신이 사용할 수있는LD_PRELOAD
씌우다execlp
, execvp
그리고execvpe
라이브러리 함수는 콜론으로 구분된 부분을 나누고 PATH
각 부분을 디렉터리로 해석하는 대신 다른 작업을 수행할 수 있습니다. 바라보다
실행 전 파일 설명자 리디렉션예를 들어 LD_PRELOAD
.
또는 PATH 항목을 다음 위치에 배치할 수 있습니다.퓨즈파일 시스템은 주어진 경로가 변경 가능한 기본 디렉터리에 해당하도록 스택 파일 시스템을 구현합니다. 이는 execve
각 PATH 요소 중 하나가 작동할 때까지 각 PATH 요소를 호출하는 프로그램에 대해 작동하지만 먼저 기존 실행 파일을 찾는 PATH 항목을 반복한 다음 발견된 파일을 실행하는 프로그램을 혼란스럽게 합니다.