구문 오류: 잘못된 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 &아무 문제 없이 실행됩니다. 쉘에서 시작하려는 이유는 매분마다 크론탭을 실행하고 싶기 때문입니다.

답변1

>&은(는) 에서 지원하는 구문이 아닙니다 sh. sh해당 스크립트에서 명시적으로 셸을 사용하고 있습니다 . 해당 줄을 다음과 같이 다시 작성해야 합니다.

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

답변2

>&cshstdout 및 stderr을 모두 파일로 리디렉션하는 구문( zsh의 최신 버전 에서도 지원됨 )입니다.bash

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

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 및 파생상품과 fish
  • >& file: csh, tcsh, zsh 및 bash 4+(단, 파일 이름이 일련의 십진수가 아닌 경우에만 해당되며 그렇지 않으면 zshBourne 리디렉션 연산자입니다).bash>&fd
  • &> file: bash 및 zsh 3+
  • > file >[2=1]: rc 및 파생 상품
  • > file ^&1: 물고기

¹ !자체는 Korn 셸에서 도입되었으며 Bourne 셸에서는 사용할 수 없지만 shPOSIX에서 지정되었으므로 최신 sh구현에서 사용할 수 있습니다.

관련 정보