파이프를 사용하면 간단한 쉘 내장 명령을 사용하여 파일을 생성할 수 있습니다.
{ echo "#!/bin/bash" \
echo "echo Hello, World!" \
} > helloworld.sh
이것이 있으면 chmod
실행 가능합니다.
$ chmod 755 helloworld.sh
$ ./helloworld.sh
Hello, World!
이 단계를 저장할 수 있는지 알고 싶습니다 chmod
. 나는 발견했다umask
작업을 완료할 수 없습니다.. 하지만 누군가는 환경 변수, bash 트릭, 파이프 또는 이를 수행하는 기타 영리한 방법을 알고 있을 수도 있습니다.
실행 가능한 비트가 설정된 파일을 생성할 수 있나요?
답변1
쉘 리디렉션 연산자만으로는 실행 파일을 생성할 수 없습니다. 이식 가능한 방법은 없으며 bash에는 방법이 없습니다(소스 코드에서 리디렉션 호출을 볼 수 있습니다).do_redirection_internal
어느수신 전화 redir_open
매개변수는 mode
0666으로 설정되어 있으며, open
모드는 순차적으로 호출됩니다.)
어쨌든 쉘 명령을 호출하게 되므로 ; chmod +x …
어딘가에 추가하십시오. 전혀 문제가 없습니다. 코드 한 줄만 더 있어도 문제가 되지 않습니다. 세 가지 작업(주어진 내용으로 파일 생성, 파일을 실행 가능하게 만들고 실행)을 수행해야 하므로 세 줄을 작성합니다.
지정된 특정 내용이 포함된 실행 파일을 생성하는 상대적으로 모호한 쉘 명령이 있습니다.uudecode
. 하지만 사용을 권장하지 않습니다. 읽을 수 없는 형식으로 입력을 전달해야 하고 사용자의 umask를 우회하며 모호합니다.
파일을 실행하는 데 사용할 인터프리터를 알고 있다면 bash /the/script
대신 호출하는 것이 현명한 선택입니다.chmod +x /the/script && chmod +x
답변2
파이프된 입력에서 실행 가능한 쉘 스크립트를 생성하는 함수:
pipe2script() { touch "$1" ; chmod +x "$1" ; \
echo '#!'"$(which ${2:-bash})" > "$1" ; cat >> "$1" ; }
pipe2script
두 줄의 텍스트를 다음으로 파이프하는 데 사용됩니다 foo.sh
.
printf 'echo hello world\necho bye\n' | pipe2script foo.sh
그러면 새 실행 파일이 출력됩니다 foo.sh
.
$ ls -log foo.sh
-rwxrwxr-x 1 38 Mar 18 09:05 foo.sh
실행 중인 cat foo.sh
프로그램:
#!/bin/bash
echo hello world
echo bye
달리다:
./foo.sh
산출:
hello world
bye
이 pipe2script
함수는 기본적으로 using 을 사용 bash
하지만 다른 쉘 이름(예: , , 등)으로 두 번째 인수를 사용할 dash
수 zsh
있습니다 ksh93
. 쉘 명령을 사용한 예 python
:fish
math
printf 'math "99^33"\n' | pipe2script foo.fish fish
실행 중인 cat foo.fish
프로그램:
#!/usr/bin/fish
math "99^33"
출력 ./foo.fish
:
717730532598275105894510914059816191752829524684539601273450723299
스크립트 사본을 편집합니다.
sed '2,${s/.*/echo & | jethro/e;s/ / "/;s/$/"/}' foo.sh | pipe2script foojc.sh
런타임 출력:
$ ./foojc.sh
howdy world
y'all come back now, heah?