파이프를 통해 실행 파일 생성

파이프를 통해 실행 파일 생성

파이프를 사용하면 간단한 쉘 내장 명령을 사용하여 파일을 생성할 수 있습니다.

{ 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매개변수는 mode0666으로 설정되어 있으며, 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하지만 다른 쉘 이름(예: , , 등)으로 두 번째 인수를 사용할 dashzsh있습니다 ksh93. 쉘 명령을 사용한 예 python:fishmath

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?

관련 정보