ksh에 대한 1라인 프로세스 교체

ksh에 대한 1라인 프로세스 교체

이 명령이 있고 다음에서 작동합니다 bash.

sh <(curl -sSl https://appi.sh/launch)(발표이 대화형 스크립트)

나는 또한 이 1-liner가 작동하기를 원합니다 ksh. 현재 오류는 다음과 같습니다.

syntax error: `(' unexpected`

kshAS에서 스크립트를 실행하면 sh launch.sh잘 작동하므로 명령 길이를 기하급수적으로 늘리지 않고도 bash/ksh에서 단일 1줄 작업을 수행할 수 있는 방법이 있기를 바랐습니다.

답변1

/dev/fd/n프로세스 교체 기능은 원래 ksh86의 ksh에서 나왔지만 처음에는 특수 파일을 지원하는 시스템에서만 사용할 수 있었습니다.

이 상황은 ksh93u+가 2012년에 출시될 때까지 바뀌지 않았으며 나중에 프로세스 대체에 대한 지원을 추가한 다른 많은 쉘과 마찬가지로 ksh는 /dev/fd사용할 수 없을 때 명명된 파이프를 사용할 수 있습니다. ksh93일반적으로 간주실험적인그리고 ksh88과 완전히 역호환되지 않으므로 ksh88 사용을 고집하는 몇 가지 시스템을 찾을 수 있는데, 제가 아는 한 이 시스템은 명명된 파이프를 사용한 적이 없습니다.

ksh(pdksh) 또는 그 하위 항목(예: mksh 또는 OpenBSD의 sh)의 공개 도메인 복제본에는 프로세스 대체가 추가된 적이 없지만, 이 경우 다른 단어로 된 오류 메시지가 표시됩니다.

따라서 AT&T ksh의 이전 버전이 있고 /dev/fd시스템에서 또는 ksh가 빌드되었을 때 사용할 수 없는 것으로 보입니다.

그러나 프로세스 대체는 POSIX 기능이 아닙니다. AT&T ksh(1986년 이후), zsh(1990년 이후) 및 bash(1993년 이후)에서만 사용할 수 있으며, yash <(cmd)와 yash는 >(cmd)다른 목적으로 사용됩니다(프로세스 리디렉션). rc하위 항목 fish에도 (어느 정도) 이 기능이 있지만 구문이 다릅니다.

여기에서 다음을 수행할 수 있습니다.

# without arguments for the script:
curl -sSl https://appi.sh/launch | sh
# with arguments
curl -sSl https://appi.sh/launch | sh -s arg1 arg2

launch하지만 이 스크립트는 표준 입력에서 읽기 때문에 적합하지 않습니다 . 또는:

# without arguments for the script:
sh -c "$(curl -sSl https://appi.sh/launch)"
# with arguments:
sh -c "$(curl -sSl https://appi.sh/launch)" sh arg1 arg2

스크립트의 전체 내용을 인라인으로 전달하는 데 사용됩니다. 이 접근 방식은 스크립트가 너무 크지 않은 한(매개변수 + 환경의 크기 제한 또는 Linux와 같은 시스템의 경우 단일 매개변수의 크기 제한 내에 적합) 작동할 수 있습니다.

아무튼 동시에그 스크립트sh그 자체는 시스템의 유틸리티가 GNU와 유사하다고 가정하는 유효한 POSIX 구문으로 작성된 것 같습니다 (비 POSIX grep -R또는 참조 sed -i). 따라서 이전 버전의 AT&T ksh가 설치된 시스템에서는 작동하지 않을 수도 있습니다.

관련 정보