특정 순서로 파일을 읽는 프로그램이 있습니다. 이 예에서는 둘 다 동일한 확장자 txt를 갖습니다.
{program_name} {input 1...} {output}
출력 파일 이름을 "a.txt"로 지정했기 때문에 이를 호출했을 때 첫 번째 결과가 되었으며 ls
, 이는 이 명령에 대한 파일 입력 순서를 보여줍니다.
{program_name} *.txt
첫 번째 결과가 마지막 결과로 나타나기를 원합니다. 별 매칭 순서를 바꾸는 방법은 무엇입니까? 파이프를 사용해야 하는 경우 특수 문자나 공백이 올바르게 인용되도록 매개변수를 올바르게 입력하는 구문은 무엇입니까?
답변1
사용 zsh
:
zsh -c 'program *.txt(.^on)'
는 패턴에 대한 수정자 (.^on)
이므로 일반 파일( )과만 일치하고 결과 목록은 역순( )으로 정렬( )됩니다.zsh
*.txt
.
o
^
n
그러면 생성된 파일 이름 목록을 명령줄 인수로 사용하여 실행되는 비대화형 zsh
셸이 시작됩니다. program
이 명령은 파일 이름에 공백이나 줄 바꿈 등이 포함되어 있어도 역방향 인수 목록을 올바르게 처리합니다.
예:
$ touch {a..d}.txt
$ echo *.txt
a.txt b.txt c.txt d.txt
$ zsh -c 'echo *.txt(.^on)'
d.txt c.txt b.txt a.txt
비 zsh
솔루션:
set --
for fname in *.txt; do
set -- "$fname" "$@"
done
program "$@"
또는 예를 들어 명명된 배열을 사용합니다 bash
.
args=()
for fname in *.txt; do
args=( "$fname" "${args[@]}" )
done
program "${args[@]}"
두 코드 조각 모두 *.txt
패턴과 일치하는 이름을 기반으로 배열이 구성됩니다. 각 이름은 배열 앞쪽으로 푸시되므로 배열은 성이 먼저 끝나는 효과가 있습니다.
첫 번째 경우에는 위치 인수 목록을 배열로 사용합니다. 이 코드는 sh
유사한 셸에서 작동해야 합니다.
프로그램의 인수 목록에서 마지막 이름만 필요하고 확장 순서대로 다른 이름을 가질 수 있는 경우 다음 코드가 sh
유사한 셸에서 트릭을 수행합니다.
set -- *.txt
fname=$1
shift
program "$@" "$fname"
또는 bash
특정 구문과 명명된 배열을 사용하여
args=( *.txt )
program "${args[@]:1}" "${args[0]}"
"${args[@]:1}"
element 에서 시작하는 args
배열의 모든 요소(개별적으로 인용됨) 로 확장됩니다 1
.
다시 테스트하세요 echo
:
$ args=( *.txt )
$ echo "${args[@]:1}" "${args[0]}"
b.txt c.txt d.txt a.txt