파이프로 연결된 스크립트를 어떻게 실행하나요?

파이프로 연결된 스크립트를 어떻게 실행하나요?

실행 컨텍스트부터 시작하여 질문을 이해시키세요.

Linux용 Windows 하위 시스템으로 작성된 스크립트를 실행하고 있습니다. 이 경우 \r\n줄바꿈( ) 외에 캐리지 리턴을 누적하는 스크립트가 작성되기도 합니다.

이는 예측할 수 없는 경우가 많습니다. 아마도 내 잘못일 수도 있지만 이러한 실수를 하지 않는 방법을 배우는 데는 관심이 없습니다. 따라서 캐리지 리턴을 사용하여 스크립트를 실행하는 강력한 방법이 있기를 바랍니다.

지금까지 제가 생각한 것은 보안 계층을 만나는 것입니다.

<(sed 's/\r//g' script.sh)

bash: /dev/fd/63: 권한이 거부되었습니다.

이 경우 파일 소켓(또는 그 뒤에 있는 모든 것)을 실행 가능하게 만들지 않았습니다.


bash <(sed 's/\r//g' script.sh) # works
bash <(sed 's/\r//g' foo.py) # ignores foo's hash-bang and fails

두 번째 옵션은 Python 파일 상단의 해시뱅이 무시되었거나 일부 호출 단계를 놓쳤기 때문에 실패합니다.


(임시) 옵션은 다음과 같습니다.

python3 <(sed 's/\r//g' script.py)

python<version#>그러나 이는 Python 바이너리( )의 버전 관리로 인해 문제가 있으며 #! ...스크립트 내부 줄에서 처리하는 것이 가장 좋습니다.

또한, 나머지 해시 뱅블 생태계에서는 실패할 것입니다. 어디에서나 구체적이어야 하는데, 이는 작은 스크립트를 복잡하게 만드는 데 큰 방해가 됩니다.


이것을 실행 가능하게 만드는 방법이 있습니까?아니요해시 폭발을 무시하십시오. 아니면 전반적인 문제를 해결하는 다른 방법이 있습니까?

답변1

실행하기 전에 손상된 파일을 복구하십시오.

#!/bin/bash
dos2unix script.py
./script.py

대화형으로 사용하려면 파일을 실행하기 전에 래퍼 스크립트를 사용하여 파일을 복구하세요. run_broken_file.sh다음 내용으로 파일 이름을 만듭니다 .

#!/bin/bash
dos2unix "$1"
"$@" 

그럼 당신은 실행할 수 있습니다./run_broken_file.sh ./script.py arg1 arg2 arg3

실행 예시:

$ unix2dos script.py 
unix2dos: converting file script.py to DOS format...

$ ./script.py 
/usr/bin/env: ‘python3\r’: No such file or directory

$ cat -A script.py 
#!/usr/bin/env python3^M$
import sys^M$
print(f"hello {sys.argv}")^M$

$ cat run_broken_file.sh 
#!/bin/bash
dos2unix "$1"
"$@"

$ ./run_broken_file.sh ./script.py arg1 arg2 'arg3 with spaces'
dos2unix: converting file ./script.py to Unix format...
hello ['./script.py', 'arg1', 'arg2', 'arg3 with spaces']

관련 정보