명령은 쉘에서 실행되지만 script.sh에서는 실행되지 않습니다.

명령은 쉘에서 실행되지만 script.sh에서는 실행되지 않습니다.

join파이프와 파일이라는 두 가지 소스에서 생성하려고 합니다 . 나는 다음과 같은 간단한 문장을 썼다.

FILENAME=$TMPDIR".netstat"; \
join -t , $FILENAME <(nettop -t wifi -P -x -L1 | cut -d , -f 2,5,6 | tail -n +2) | \
awk '{print $0}'

일반적으로 셸에서 실행되지만 script.sh에서는 실행되지 않습니다(아래 전체 스크립트).

./script.sh: line 16: syntax error near unexpected token `('

변수, 매개변수 또는 명령을 완전히 마스킹하기 위해 표현식에 다른 따옴표를 사용해 보았지만 스크립트를 실행할 수 없습니다.

누구든지 도와줄 수 있나요?

PS 이 스크립트는 macOS Sierra 10.12.3의 GeekTool(쉘 위젯)에 의해 호출됩니다.

PPS 예, 저는 OS X가 "Unix & Linux"가 아니라는 것을 알고 있지만 그 차이는 그다지 크지 않다고 생각합니다.

일부 주석이 포함된 전체 스크립트는 다음과 같습니다.

#!/bin/sh

FILENAME=$TMPDIR".netstat"

# checking if existing stats file
if [ ! -f $FILENAME ]; then
    nettop -t wifi -P -x -L 1 | cut -d , -f 2,5,6 | tail -n +2 > $FILENAME # save stats to file
    exit
fi

fts=`stat -r $FILENAME | cut  -d " " -f 10` # get timestamp of stats file
now=`date +%s`    # get current datetime

join -t, $FILENAME <(nettop -t wifi -P -x -L1 | cut -d , -f 2,5,6 | tail -n +2) | awk '{print $0}'

고쳐 쓰다. 해결됨

셰르본으로 바뀌었어요#!/bin/bash

답변1

이는 스크립트를 실행하는 데 사용하는 셸이 대화형 셸과 다르기 때문에 발생하는 것이 거의 확실합니다.

shebang 라인은 이므로 #!/bin/sh스크립트는 인터프리터에 의해 실행됩니다 /bin/sh. Ubuntu와 같은 배포판에는 프로세스 교체(이것 ) /bin/sh와 같은 bash의 모든 기능을 지원하지 않는 대시 셸이 있습니다 .<()

해결 방법은 호출 스크립트를 사용 /path/to/bash /path/to/script하거나 셔뱅 라인( #!/path/to/bash)을 수정하는 것입니다.

답변2

이 스크립트는 bash 특정 기능을 활용합니다.프로세스 교체, 문법으로 표현됩니다 <(...). (당신은 또한 볼 수 있습니다고급 Bash 스크립팅 가이드).

그것을 없애기 위해바시즘문제가 있는 행을 다시 정렬할 수 있습니다.

join -t, $FILENAME <(nettop -t wifi -P -x -L1 | cut -d , -f 2,5,6 | tail -n +2)

도착하다:

nettop -t wifi -P -x -L1 | cut -d , -f 2,5,6 | tail -n +2 | join -t, $FILENAME -

이렇게 하면 /bin/sh로 실행할 때 오류가 제거됩니다.

관련 정보