입력을 허용하는 bash 스크립트로 sed의 출력을 실행합니다.

입력을 허용하는 bash 스크립트로 sed의 출력을 실행합니다.
sed 's/docker/sudo docker/g' ./generate.sh | xargs bash

호출할 때 실행되는 것처럼 모든 호출을 대체하는 generate.sh스크립트 를 실행하고 싶습니다 . 또한 사용자 입력이 필요합니다. 그러면 어떻게 작동하게 합니까? 파일을 저장할 수 없고 터미널만 사용할 수 있습니다.dockersudo dockerbash generate.sh

답변1

@Freddy의 현재 삭제된 답변에 대해 언급한 것처럼 임시 생성된 스크립트의 경로가 현재 작업 디렉터리에 있는 것도 중요합니다. 스크립트는 자체 경로를 기준으로 다른 리소스를 찾고 이러한 작업은 수행되지 않기 때문입니다. 시작하다:

bash <(sed 's/docker/sudo docker/g' ./generate.sh)

스크립트의 경로는 /dev/fd/63또는와 같으며 스크립트는 /tmp/some-temporary-named-pipe현재 작업 디렉터리가 있는 디렉터리에서 또는 대신 리소스를 찾습니다./dev/fd/tmpgenerate.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

대신에 dockercall 을 다시 정의하세요 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)

관련 정보