cmd.py
파일을 명령줄 인수로 받아들이고 구문 분석기 인수를 사용하여 처리하는 Python 코드()가 있습니다 . 함수 매개변수를 전달하는 것처럼 다른 코드( files.py
) 의 파일을 해당 코드로 전달하고 싶습니다 . cmd.py를 수정하지 않고도 이 작업을 수행할 수 있습니까?cmd.py
답변1
예, 다음과 같이 할 수 있습니다.
cmd.py `files.py`
그런 다음 files.py가 먼저 실행되고 출력(예: "file1.txt file2.txt")이 cmd.py에 대한 입력이 됩니다.
예:
cat `ls`
이는 작업 디렉토리에서 ls가 찾은 모든 파일을 "캡처"합니다.
답변2
여기에서 할 수 있는 일이 몇 가지 있습니다. 먼저 간단한 명령 대체:
cmd.py $(files.py)
여기서 한 가지 문제는 파일 이름에 공백, 탭 또는 줄 바꿈이 있으면 이러한 파일 이름은 단일 인수로 전달되지 않고 이러한 문자가 발생할 때마다 다른 인수로 분할된다는 것입니다.
대안으로, cmd.py
각 파일을 별도의 줄에 출력하는 경우 IFS
줄 바꿈만 포함하도록 셸을 설정할 수 있습니다.
IFS='
'
cmd.py $(files.py)
즉, 개행 문자가 포함된 파일 이름만 문제가 되어 오류가 줄어듭니다.
또 다른 질문은 출력되는 파일 수가 많으면 어떻게 되는지입니다 files.py
. 명령줄은 시스템이 처리할 수 있는 것보다 길어질 수 있습니다(제한 요소는 ARG_MAX
Linux의 명령줄 전체 크기에 다른 콘텐츠의 전체 크기를 더한 것입니다). 프로그램 xargs
은 이러한 상황을 위해 설계되었습니다. 프로그램을 한 번 실행하기에는 명령줄이 너무 길면 여러 실행으로 분할됩니다. 이것이 도움이 된다면 다음을 수행할 수 있습니다.
files.py | xargs cmd.py
물론 이는 문제가 있는 문자가 포함된 파일 이름이 마치 해당 이름이 셸에 직접 입력된 것처럼 인용/이스케이프될 것으로 예상하기 때문에 잠재적으로 문제가 될 수도 있습니다. 한 가지 옵션은 cmd.py
출력이 올바르게 인용되도록 변경하는 것이지만 일부 버전에서는 위의 설정 xargs
과 유사하게 개행으로 구분된 파일 이름을 허용하도록 만들 수 있습니다 . 옵션이 지원되는 IFS
경우 ( Linux의 GNU):-d
xargs
files.py | xargs -d '\n' cmd.py
마지막으로 아마도 가장 좋은 접근 방식( xargs
현재 대부분의 구현에서 지원됨)은 입력 파일을 개행 문자 대신 null로 구분할 수 있다는 것입니다. 이건 다루기 쉬울 거야어느Null은 Unix 파일 이름에 허용되지 않는 유일한 문자이므로 복잡한 인용을 사용하지 않는 파일 이름:
files.py | xargs -0 cmd.py