
sed 's/docker/sudo docker/g' ./generate.sh | xargs bash
호출할 때 실행되는 것처럼 모든 호출을 대체하는 generate.sh
스크립트 를 실행하고 싶습니다 . 또한 사용자 입력이 필요합니다. 그러면 어떻게 작동하게 합니까? 파일을 저장할 수 없고 터미널만 사용할 수 있습니다.docker
sudo docker
bash generate.sh
답변1
@Freddy의 현재 삭제된 답변에 대해 언급한 것처럼 임시 생성된 스크립트의 경로가 현재 작업 디렉터리에 있는 것도 중요합니다. 스크립트는 자체 경로를 기준으로 다른 리소스를 찾고 이러한 작업은 수행되지 않기 때문입니다. 시작하다:
bash <(sed 's/docker/sudo docker/g' ./generate.sh)
스크립트의 경로는 /dev/fd/63
또는와 같으며 스크립트는 /tmp/some-temporary-named-pipe
현재 작업 디렉터리가 있는 디렉터리에서 또는 대신 리소스를 찾습니다./dev/fd
/tmp
generate.sh
그러나 zsh에서는 다음을 수행할 수 있습니다.
TMPPREFIX=$PWD/.transformed-
bash =(sed 's/docker/sudo &/g' ./generate.sh)
명령 대체 형식 은 파이프 =(...)
대신 임시 파일을 사용하며 이를 /dev/fd/x
사용하는 방법 $TMPPREFIX
과 $TMPSUFFIX
변수 이름을 지정할 수 있습니다.
local
아니면 익명 함수에서 ly 변수를 수정하세요.
() { local TMPPREFIX=$PWD/.transformed-
bash =(sed 's/docker/sudo &/g' ./generate.sh)
}
Bash에서는 다음과 같이 할 수 있습니다:
docker() { sudo docker "$@"; }
export -f docker
bash ./generate.sh
대신에 docker
call 을 다시 정의하세요 sudo docker
.
그러나 내보낸 함수는 결국 이 스크립트에서 실행하는 다른 명령으로도 내보내집니다.
추가 확산 위험을 제한하려면 처음 사용 시 내보내기를 취소하는 것이 현명할 수 있습니다.
docker() {
typeset -f +x docker
sudo docker "$@"
}
export -f docker
bash ./generate.sh
내보낸 함수는 어쨌든 유지되지 않는다는 점에 유의하세요 sudo
(하느님 감사합니다!).
또는 다음을 사용하십시오:
bash -c 'docker() { sudo docker "$@"; }; . ./generate.sh'
이것은 심지어 작동합니다 sh
( .sh
확장자는 이것이 sh 스크립트임을 나타냅니다):
sh -c 'docker() { sudo docker "$@"; }; . ./generate.sh' ./generate.sh
두 번째는 ./generate.sh
인라인 스크립트로 전달됩니다 $0
(아마도 스크립트가 자체 경로가 무엇인지 배우는 곳일 것입니다).
스크립트가 충분히 짧은 경우 sed
출력을 전체적으로 인라인 스크립트로 전달할 수 있습니다.
bash -c "$(sed 's/docker/sudo &/g' ./generate.sh)" ./generate.sh
ksh 에뮬레이션에서는 zsh
대부분의 bash 스크립트를 해석할 수 있지만 zsh를 사용하면 이를 재정의하여 다음을 수행 $0
할 수 있습니다.
zsh --emulate ksh <(
echo '0=./generate.sh'; sed 's/docker/sudo &/g' ./generate.sh)