스크립트를 실행할 때 [[: 찾을 수 없음]이 표시되는 이유는 무엇입니까?


15

파일이 있는지 확인 해야하는 스크립트를 작성하려고합니다. 콘솔에서 내가 쓴

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

그리고 나는 얻는다

not mod

그러나 같은 일을하는 스크립트를 작성할 때 :

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

그런 다음 스크립트를 실행하면 다음과 같은 결과를 얻습니다.

./ex.sh: 2: [[: not found
mod

스크립트를 현재 디렉토리에 저장하고 이름을 ex.sh로 지정한 다음 실행 가능한지 확인했습니다. 스크립트를 호출하려면 다음을 수행하십시오.

./ex.sh

왜이 문제가 발생합니까? 나는 이미 많은 것을 시도했다.

if [ -a /home ...

if test -a /home ...

둘 다 돌아옵니다

13: -a: unexpected operator

나는 그것을 작동시킬 수 있었지만 그 때문에 첫 번째 줄을 제거해야했습니다 (#! / bin / sh) 왜 이런 일이 발생하는지 아십니까?
Buzu

시도#!/bin/bash
kev

안녕하세요 케크, 나도 그 관계를했다. 방금 질문을 업데이트했습니다. 나는 이것에 너무 많은 시간을 보냈지 만 해결할 수있어서 기쁘다. 답변 주셔서 감사합니다. 실제로 문제에 대한 해결책입니다.
Buzu

@Kev 답변으로 게시하십시오
slhck

Buzu, @Kev-답변을 찾으면 아래 답변으로 게시하십시오 . 질문을 편집하지 마십시오.
user1686

답변:


10

당신을 위해 작성된 스크립트를 실행하는 bash는 아래에서 확장 구문의 많은 기능이 부족 - [[A는 bash내장 명령과에서 사용할 수 없습니다 sh.

변경 #!/bin/sh#!/bin/bash나에 #!/usr/bin/env bash.


일부 시스템에서는 /bin/sh에 대한 심볼릭 링크 /bin/bash입니다. 그리고 그것이이라고 가정하는 bash것이 합리적으로 안전 할 것 입니다 /bin/bash.
Keith Thompson

@Keith : /bin/bash대부분의 Linux 시스템에 있지만 /usr/pkg/bin/bashBSD에 있거나 /usr/local/bin/bash소스에서 직접 컴파일하는 경우입니다.
user1686

@ grawity : 또는 소스에서 컴파일하면 다른 곳으로 결정하십시오. 좋아, 좋은 지적이야 개인적으로, 나는 /usr/bin/env해킹 ( 현재 bash발신자 $PATH에게 나타나는 것을 사용하는 것 ) 대신 YMMV 를 사용하는 것 보다 각 시스템의 shebang을 편집하고 싶습니다 . (그리고 /bin/bash관리자 권한이 있고 엉망이 아니라면 심볼릭 링크 를 만들 수 있습니다 /bin.)
Keith Thompson

@Keith : /usr/localautotools가 기본적으로 그것을 넣기로 결정한 곳입니다. "개인적으로"진행되는 한, 여러 다른 서버와 VM이 동일한 스크립트 / 도구 리포지토리에서 가져 와서 모든 커밋 후에 절반의 셰뱅을 다시 편집 할 필요가 없습니다.
user1686

그들 중 누구도 나를 위해 일하지 않았다 : / centos에 im
astroanu

0

스크립트를 실행할 때 sh 대신 bash를 지정하십시오. 나는 개인적으로 우분투 12.10에서 다르다는 것을 알았습니다.

bash script.sh arg0 ... argn

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.