구문 오류: FD 번호가 잘못되었나요?

구문 오류: FD 번호가 잘못되었나요?

내 응용 프로그램:

#!/bin/sh

#
# D2GS
#

# Go to the directory
cd ~

# Run the applications
if ! ps aux | pgrep "D2GS"; then
    wine "C:/D2GS/D2GS.exe" >& /dev/null &
fi

오류가 발생합니다.

./d2gs.sh: 14: ./d2gs.sh: 구문 오류: 잘못된 fd 번호

부팅할 때 wine "C:/D2GS/D2GS.exe" >& /dev/null &아무런 문제 없이 실행되기 때문에 이것은 이상합니다. 쉘에서 시작하려는 이유는 매분마다 crontab을 수행하고 싶기 때문입니다.

답변1

>&구문이 지원되지 않습니다 sh. sh해당 스크립트에서 이를 쉘로 명시적으로 사용하고 있습니다 . 이 줄을 다음과 같이 다시 작성해야 합니다.

wine "C:/D2GS/D2GS.exe" > /dev/null 2>&1 &

답변2

>&~이다시추zshbashstdout 및 stderr을 파일로 리디렉션하는 구문(최신 버전에서도 지원됨 )

sh(Bourne(원본) 및 POSIX) 에서 리디렉션 구문 1은 다음과 같습니다.

if ! pgrep D2GS > /dev/null; then 
  wine C:/D2GS/D2GS.exe > /dev/null 2>&1 &
fi

(또한 잘못된 ps/pgrep 구문이 있습니다. 표준 입력을 읽지 않으므로 pgrep출력을 파이프로 연결할 ps필요가 없습니다 .)

완전성을 위해 다양한 셸에서 stdout 및 stderr을 리디렉션하는 구문은 다음과 같습니다.

  • > file 2>&1: Bourne, POSIX 및 그 파생어와 피쉬
  • >& file:csh, tcsh, zsh 및 bash 4+ (이것은 파일 이름이 일련의 십진수가 아닌 경우에만 작동하고 그렇지 않으면 Bourne 리디렉션 연산자입니다 zsh) .bash>&fd
  • &> file:bash 및 zsh 3+
  • > file >[2=1]: rc 및 파생 상품
  • > file ^&1: 물고기

1 !자체는 Korn 쉘과 함께 도입되었으며 Bourne 쉘에서는 사용할 수 없습니다. 하지만 POSIX에 의해 지정되었으므로 최신 구현 sh에서 사용할 수 있어야 합니다 .sh

관련 정보