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로 실행할 때 오류가 제거됩니다.