이 명령이 있고 다음에서 작동합니다 bash
.
sh <(curl -sSl https://appi.sh/launch)
(발표이 대화형 스크립트)
나는 또한 이 1-liner가 작동하기를 원합니다 ksh
. 현재 오류는 다음과 같습니다.
syntax error: `(' unexpected`
ksh
AS에서 스크립트를 실행하면 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가 설치된 시스템에서는 작동하지 않을 수도 있습니다.