쉘에 출력을 포함 wget
하거나 파이핑 하는 프로젝트 설정 지침이 점점 더 많아지고 있습니다 . curl
NVM에서 처음 본 것 같아요.
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
.