Apple의 Automator를 사용하여 파일 이름을 쉘 스크립트로 전달합니다.

StackOverflow https://stackoverflow.com/questions/1857050

  •  13-09-2019
  •  | 
  •  

문제

폴더에서 실행하고 싶은 자동 고기 스크립트가 있습니다. 스크립트가 폴더에서 각 파일을 가져 와서 쉘 명령을 실행하기를 원합니다. Automator는 입력을 stdin에 전달하도록 설정되었지만 아래에서 stdin을 올바르게 사용하고 있다고 생각하지 않으시겠습니까?

for f in "$@" 
do
    java -Xmx1000m -jar /Users/myprog/myprog.jar $f 
done
도움이 되었습니까?

해결책

특수 변수 $@ 스크립트에 제공된 모든 명령 줄 인수를 나타냅니다.

그만큼 for 루프는 각각을 통해 단계를 밟고 매번 JAR 파일을 실행합니다. 스크립트를 다음과 같이 줄일 수 있습니다.

for f
do
    java -Xmx1000m -jar /Users/myprog/myprog.jar "$f"
done

기본 동작 이후 for 사용하는 것입니다 $@.

인수에 공백이있는 경우 Java 명령의 끝에 $ f 약 $ f를 넣어야합니다.

다른 팁

당신은 당신이 "stdin을 올바르게 사용하지 않는다"고 말할 때 맞습니다. 실제로, 당신이 제공 한 스크립트 스 니펫에서, 당신의 스크립트는 당신이 명령 줄에서 인수로 파일을 가져 오는 것으로 가정합니다 ... 당신은 stdin을 전혀 사용하지 않습니다!

실행 쉘 스크립트 조치의 오른쪽 상단 모서리에 X 아래에는 2 가지 옵션이있는 드롭 다운 상자가 있습니다. 이 옵션은 선택한 파일이 스크립트 작업에 어떻게 전달되는지를 지시합니다. '인수'옵션이 선택된 경우 스크립트는 다음 템플릿을 사용해야합니다.

for f in "$@"; do
# so stuff here
done

이 템플릿은 '인수'가 선택 될 때 조치 자체에 의해 제공됩니다.

반면에, 'to stdin'옵션이 선택되면 스크립트는이 tamplate을 사용해야합니다.

while read fname; do  # read each line - assumes one file name per line
   # do clever stuff with the filename
   echo $fname # to illustrate we'll simply copy the filename to stdout
done

(Bash 스크립팅을 모르는 경우, # 이후의 모든 것은 주석입니다)

스크립트 조치에서 제공 한 템플릿은 단순하고 단일 명령입니다.

cat

제 생각에는 그다지 도움이되지 않습니다.

실제로 스크립트 영역에 텍스트를 입력 할 때까지 'stdin'과 'arguments'사이에서 바뀌면 스크립트 상자의 내용이 변경 될 것입니다 (스크립트가 어떻게 생겼는지에 대한 힌트라고 가정합니다). , 스위칭은 더 이상 발생하지 않습니다.

여기에서 본 내용을 기반으로 Finder의 문맥 메뉴를 사용하여 파일을 마우스 오른쪽 버튼으로 클릭하고 변환 할 수있는 편리한 "서비스"를 설정할 수 있습니다.

이것을 설정하려면 :

  • Automator를 시작하십시오
  • 메인 메뉴에서 "새"를 선택하십시오.
  • "서비스"(기어 아이콘) 선택
  • 왼쪽 라이브러리에서 기본 "편집기"영역으로 "유틸리티 -> 쉘 스크립트 실행"을 드래그 앤 드롭합니다.
  • 기존 텍스트 "CAT"를 다음 코드로 바꾸십시오.

    for f in "$@"; do
        /usr/bin/afconvert -f caff -d LEI16@32000 -c 1 --mix "$f"
        echo "$f converted"
    done
    

    참고 : 위의 설정은 16 비트 @ 32000Hz (lei16 @ 32000 = Little Endian 16 비트)로 모노 (-c 1 -mix)로 변환됩니다. 사용 가능한 모든 옵션을 보려면 터미널에서/usr/bin/afconvert -h를 사용하십시오.

  • 편집기 상단에는 두 개의 드롭 다운이 표시되어 다음과 같이 설정해야합니다.

    Service receives selected [Files and Folders] in [Finder.app]
    
  • 쉘 스크립트 편집기 영역에서 다음을 확인하십시오.

    "Shell" is set to "/bin/bash"
    

    그리고

    "pass input" is set to "arguments" 
    
  • "CAF로 변환"과 같은 것을 저장하십시오.

  • wav가있는 폴더로 이동하십시오.
  • WAV를 마우스 오른쪽 버튼으로 클릭하면 상황에 맞는 메뉴 하단에 "CAF로 변환"이 표시됩니다.

스크립트가 stdin을 사용하지 않는 것처럼 보이기 때문에 귀하의 질문을 이해하지 못합니다. 그만큼 $@ 특수 매개 변수 Argv의 인수로 전달 된 위치 매개 변수로 확장됩니다. 이 방법으로 쉘에서 직접 스크립트를 호출하는 것과 같은 방식으로 작동합니다.

$ cat >test
for f in "$@"
do
  echo $f
done
$ chmod 755 test
$ ./test a b c
a
b
c

Stdin으로부터 논쟁을 받고 싶다면 ~할 수 있었다 다음과 같이하십시오 :

$ cat >test2
for f in $(cat)
do
  echo $f
done
$ chmod 755 test2
$ ./test2 <<EOF
> a b c
> EOF
a
b
c
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top