잠금을 피하기 위해 스크립트를 쉘로 파이프

잠금을 피하기 위해 스크립트를 쉘로 파이프

쉘에 출력을 포함 wget하거나 파이핑 하는 프로젝트 설정 지침이 점점 더 많아지고 있습니다 . curlNVM에서 처음 본 것 같아요.

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

따라서 이것은 스크립트 파일을 bash로 파이프하는 데 발생하는 일부 문제(파일 잠금 및 권한)에 대한 간단한 해결책처럼 보입니다.

cat script.sh | bash

Bash는 나의 모국어가 아니며 이것이 금지되어 있는지 또는 내 문제를 해결하는 더 좋은 방법이 있는지 궁금합니다.

(내 스크립트는 git 저장소에서 최신 버전을 가져와 프로세스에서 자신을 대체합니다. 또는 적어도 그렇게 해야 하지만 실행 스크립트의 잠금으로 인해 그렇게 할 수 없습니다. 그렇지 않으면 교체 파일이 지워집니다. +x 플래그이므로 이 솔루션은 모든 상자를 확인합니다)

답변1

나는 당신의 문제가 다른 곳에 있다고 생각합니다. 자체적으로 변경되는 잠금 스크립트는 없습니다.

a.sh예를 들어 다음과 같은 두 개의 스크립트를 생성할 수 있습니다 b.sh.

#!/bin/sh
# a.sh
cp a.sh tmp.sh
cp b.sh a.sh
mv tmp.sh b.sh
echo A
#!/bin/sh
# b.sh
cp a.sh tmp.sh
cp b.sh a.sh
mv tmp.sh b.sh
echo B

이제 마법을 시전할 수 있습니다.

$ a.sh
A
$ a.sh
B
$ a.sh
A

이 경우 실행 플래그는 손실되지 않습니다.

스크립트 파이핑의 유일한 장점 bash은 명령이 스크립트를 생성하고 해당 스크립트를 실제 파일에 저장하지 않으려는 경우입니다. 예제에서는 즉시 curl다운로드하여 install.sh실행합니다. 파이프가 없으면 다음 세 줄이 됩니다.

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh >tmp.sh
$ bash tmp.sh
$ rm tmp.sh

파이프cat

$ cat script.sh | bash

기능적으로는 simple 과 동일합니다 bash script.sh.

관련 정보