실행 컨텍스트부터 시작하여 질문을 이해시키세요.
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']