Bash 스크립트는 앞에 "bash"를 입력하지 않으면 실행되지 않습니다


11

학교 시스템에서는 입력하지 bash않거나 csh스크립트 유형을 표시 하지 않고 스크립트 파일을 실행할 수 있습니다. 그러나 우분투에서는 bash script.bash예를 들어 입력해야합니다 . 우분투에서 항상 필요합니까, 아니면 변경할 수있는 설정입니까?


1
실행 파일로 설정되어 있습니까?
jsolarski

예, 파일이 실행 가능하므로 파일이 저절로 실행되는 것 같습니다.
muttley91

1
./script를 입력하면 어떤 오류가 발생합니까? 줄 끝에 추가 문자를 넣는 Windows 편집기에서 스크립트가 변경되지 않았습니까? 스크립트가 bash로 실행되어야한다는 것을 가리키는 첫 번째 줄이 깨집니다.
João Pinto

1
어떻게 시작하고 오류 메시지는 무엇입니까?
사용자가 알 수 없음

.shbash 스크립트를 사용하지 않는 경우 +1 그러나 일반적으로 파일 확장명은 UNIX 환경에서 실행 가능한 스크립트에 사용되지 않습니다.
nyuszika7h

답변:


17
  1. ./script전체 경로 또는 기타로 스크립트를 시작하십시오 . 그냥 script않을 수없는 작품은 (는 디렉토리에있는 경우 작동 $PATH과 같은, /usr/binUNIX 시스템에서이 경로에 현재 디렉토리를하는 습관이 아니다 이후 (보안상의 이유로, 그리고 그것의 좋은!))

  2. 스크립트가 실행 가능한지 확인하십시오 (예 : chmod +x script실행 가능하게 함).

  3. #!/bin/bash스크립트의 첫 번째 줄 이 있어야 합니다. 또한 일종의 Windows 편집기를 사용하여 편집하지 마십시오. 유닉스와는 다른 eol (end of line)의 "DOS 유형"을 사용하기 때문에 (위의 체크리스트가 정상이지만 "나쁜"경우 인터프리터 : 그러한 파일이나 디렉토리가 없습니다. "/ bin / bash 인 경우에도 인쇄 할 수 없기 때문에 종종 그 이유가 있습니다. 따라서 일반적으로 보지 않습니다. \ r은 통역사 경로)

이미 언급 한 다른 사람들 : /bin/bashbash 기능을 사용하고 /bin/sh심볼릭 링크를 사용하는 것이 중요 /bin/bash하지만 요즘 (내가 아는 dash한) POSIX 만 bash 호환성을 제공하지 않는 심볼릭 링크가 sh있습니다. 우리 회사의 매우 비싼 소프트웨어 조차도이 문제가 중요합니다. 스크립트 #!/bin/sh는 첫 번째 줄로 포함되지만 bash 기능에도 의존합니다.


그래서 내가 찾은 것처럼 ./script와 같이 실행해야합니다. 매번 "bash"를 입력하는 것보다 낫습니다. 나는 이것을 전에 알고 있었고, 그것은 단지 내 마음을 미끄러 뜨렸다. 오, 고마워요!
muttley91

이론적으로 현재 작업 디렉토리를 PATH 변수에 넣을 수 있으므로 "./script"대신 "script"만 사용할 수 있지만 경고합니다. 이것은 실제로 UNIX 시스템의 습관이 아니며 보안 문제가 될 수 있습니다 ! 또한 학교에서는 유닉스 시스템에서 결코 해결책이되지 않은 방식으로 학습하는 것이 좋지 않기 때문에이 해결책을 피할 것입니다.
LGB

1
또는 바람직하게 #!/usr/bin/env bash는 약간 더 휴대하기 쉽다.
Sparhawk

4

파일의 첫 줄이 다음과 같은지 확인하십시오.

#!/bin/bash

shebang이 #!/bin/sh인 경우 bash 특정 기능을 사용하지 말고 POSIX 기능 만 사용해야합니다. /bin/sh에 대한 심볼릭 링크 인 경우에도 bashbash는 sh로 실행될 때 POSIX 호환 모드에서 실행되어 일부 bash 기능을 비활성화합니다.

물론 스크립트가 실행 가능한지 확인해야합니다.


아니, 어쨌든 습관에서 벗어나도록 설정했습니다.
muttley91

0

대안으로 강력히 권장하지 않는 방법은에 추가 .하는 것 PATH입니다.

PATH=".:$PATH"

또는

PATH="$PATH:."

이 방법의 문제점은 전자의 경우 모든 시스템 명령이 현재 디렉토리의 실행 파일로 대체 될 수 있고 후자의 경우 알 수없는 명령이 여전히 재정의 될 수 있다는 것입니다.

다음을 고려하세요:

파일 : ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

너무 늦을 때까지 눈치 채지 못할 것입니다.


1
단어 선택은 여기에서 약간 오도됩니다. 명령이 무시되지 않습니다. echo예를 들어, 현재 작업 디렉토리에 시스템 디렉토리에있는 것과 동일한 이름을 가진 명령이있는 경우, 예 를 들어 디렉토리에있는 명령이 해당 디렉토리가 PATH변수 앞에 설정되어 있기 때문에 단순히 디렉토리의 명령이 사용됩니다 /bin. 셸은의 순서에 따라 특정 디렉토리에서 명령을 찾기 만하 PATH며 어떤 것도 무시 / 파기하지 않습니다. 그러나 네, 이것은 의미가 있습니다
Sergiy Kolodyazhnyy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.