2013-10-10 5 views
2

ESXi 셸에서 bash 셸 스크립트를 실행하려고했습니다.POSIX 환경에서 bash 쉘 스크립트를 어떻게 실행할 수 있습니까?

Think ESXi는 posix와 호환되며 posix 컴파일러는 많은 구문 오류를 발생시킵니다.

POSIX 모드에서 실행할 때 누군가가 대답을

+0

POSIX 환경에서 실행하기 전에 스크립트를 테스트하십시오. 'bash --posix scriptname'을 사용하여 동작을 시뮬레이트 할 수 있습니다. – devnull

+0

http://mywiki.wooledge.org/Bashism –

+0

& ESXi에서는 bash가 같지 않습니다. 그것은 'busybox' bash 쉘입니다. – anishsane

답변

1

manual 목록 변경된 행동이 있으면 알려 주시기 바랍니다. 그에 따라 스크립트를 수정해야합니다.

  1. 해시 테이블의 명령이 더 이상 존재하는 경우, 배쉬는 다시하지 검색합니다 $PATH을 새 위치를 찾을 수 :


    다음은 POSIX mode이 적용되는 경우 변경된 것입니다. 'shopt -s checkhash'과 함께 사용할 수도 있습니다.

  2. 작업이 0이 아닌 상태로 종료 될 때 작업 제어 코드 및 내장 명령으로 인쇄되는 메시지는 'Done(status)'입니다.
  3. 작업이 중지 될 때 작업 제어 코드 및 내장 명령으로 인쇄되는 메시지는 'Stopped(signame)'입니다. 여기서 signame은 SIGTSTP입니다.
  4. bg 내장 명령은 배경이 현재 작업인지 아니면 이전 작업인지 여부를 나타내는 표시가없는 백그라운드에 배치 된 각 작업을 설명하는 데 필요한 형식을 사용합니다.
  5. 예약어가 인식되는 컨텍스트에 나타나는 예약어는 별칭 확장을 거치지 않습니다.
  6. POSIX PS1PS2 이력 번호 ‘!’‘!’의 확장 및 ‘!!’에 활성화되고, 변수는 확장 promptvars 옵션의 설정에 관계없이 PS1PS2의 값들에 수행된다.
  7. POSIX 시작 파일은 일반 Bash 파일이 아니라 ($ENV) 실행됩니다.
  8. 줄 바꿈 확장은 줄의 모든 할당 문 대신 명령 이름 앞에 오는 할당에서만 수행됩니다.
  9. 기본 내역 파일은 ~/.sh_history (기본값은 $HISTFILE)입니다.
  10. 'kill -l'의 출력은 모든 신호 이름을 'SIG'접두어없이 공백으로 구분하여 한 줄에 인쇄합니다.
  11. 내장형 kill은 'SIG'접두어가 붙은 신호 이름을 허용하지 않습니다.
  12. 비대화 형 쉘은 파일 이름이 . 인 경우 종료됩니다.
  13. 산술 확장시 구문 오류로 인해 표현이 잘못되면 비대화 형 쉘이 종료됩니다.
  14. (non-interactive) 형 모드 쉘 출구 거기 . 또는 source 내장 명령 읽을 스크립트에 구문 오류, 또는 eval 내장에 의해 처리 된 문자열의 경우.
  15. 리디렉션 연산자는 셸이 대화 형이 아닌 경우 리디렉션에서 단어의 파일 이름 확장을 수행하지 않습니다.
  16. 리디렉션 연산자는 리디렉션에서 해당 단어에 대한 단어 분할을 수행하지 않습니다.
  17. 함수 이름은 유효한 쉘 이름이어야합니다. 즉, 문자, 숫자 및 밑줄 이외의 문자를 포함 할 수 없으며 숫자로 시작할 수 없습니다. 유효하지 않은 이름으로 함수를 선언하면 비대화 형 쉘에서 치명적인 구문 오류가 발생합니다.
  18. 명령 검색 중에 셸 함수 앞에 POSIX 특수 내장 명령이 있습니다.
  19. 시간 예약어는 그 자체로 명령으로 사용될 수 있습니다. 이 방법으로 사용하면 쉘 및 완료된 하위에 대한 타이밍 통계를 표시합니다. TIMEFORMAT 변수는 타이밍 정보의 형식을 제어합니다.
  20. 큰 따옴표 안에 나타나는 ${...} 확장을 구문 분석하고 확장 할 때 작은 따옴표는 더 이상 특수하지 않으며 연산자가 패턴 제거를 수행하도록 정의 된 연산자가 아니면 닫는 중괄호 나 다른 특수 문자를 인용 할 수 없습니다. 이 경우 일치하는 쌍으로 나타나지 않아도됩니다.
  21. 다음 토큰이 ‘-’으로 시작하는 경우 파서는 예약어로 시간을 인식하지 않습니다.
  22. POSIX 특수 내장 명령이 오류 상태를 반환하면 비대화 형 쉘이 종료됩니다. 치명적인 오류는 POSIX 표준에 나열된 오류이며 잘못된 옵션 전달, 리디렉션 오류, 명령 이름 앞에 오는 할당에 대한 변수 할당 오류 등을 포함합니다.
  23. 할당 문 뒤에 명령 이름이 없을 때 변수 할당 오류가 발생하면 비대화 형 쉘이 오류 상태로 종료됩니다. 변수 할당 오류는 예를 들어 읽기 전용 변수에 값을 할당하려고 할 때 발생합니다.
  24. 특수한 기본 제공보다 앞에 오는 지정 문에는 변수 지정 오류가 발생하지만 다른 단순 명령에는 지정되지 않으면 오류 상태 인 비대화 형 쉘이 존재합니다.
  25. for 문의 명령문 반복 변수 또는 select 문의 선택 변수가 읽기 전용 변수 인 경우 비 대화식 쉘이 오류 상태로 종료됩니다.
  26. 공정 대체를 이용할 수 없습니다.
  27. POSIX 특수 기본 제공 기호 앞에 오는 할당 문은 기본 제공 작업이 완료된 후 셸 환경에서 유지됩니다.
  28. 쉘 함수 호출 이전의 할당 문은 POSIX 특수 내장 명령이 실행 된 것처럼 함수가 반환 된 후 셸 환경에서 유지됩니다.
  29. exportreadonly 내장 명령은 POSIX에서 요구하는 형식으로 출력을 표시합니다.
  30. trap 내장 신호는 신호 이름 앞에 SIG없이 신호 이름을 표시합니다.
  31. trap builtin은 가능한 신호 지정에 대한 첫 번째 인수를 검사하지 않으며 해당 인수가 유효한 숫자 일 경우에만 신호 처리를 원래 처리로 되돌립니다. 사용자가 주어진 신호에 대한 핸들러를 원래 처리로 재설정하려면 ‘-’을 첫 번째 인수로 사용해야합니다.
  32. .source 기본 제공 업체는 PATH을 검색하여 찾을 수없는 경우 파일 이름 인수에 대해 현재 디렉토리를 검색하지 않습니다.
  33. 명령 대체를 실행하기 위해 스폰 된 하위 셸은 부모 셸의 -e 옵션 값을 상속합니다. POSIX 모드가 아닌 경우 Bash는 이러한 서브 쉘에서 -e 옵션을 지 웁니다.
  34. 비대화 형 쉘에서도 별칭 확장이 항상 활성화됩니다.
  35. alias 내장 명령에 별칭 정의가 표시되면 -p 옵션이 제공되지 않는 한 별칭 정의와 함께 별칭 정의가 표시되지 않습니다.
  36. set 내장 옵션을 옵션없이 호출하면 쉘 함수 이름과 정의가 표시되지 않습니다.
  37. set 내장 옵션을 옵션없이 호출하면 결과에 인쇄되지 않는 문자가 포함되어 있어도 셸 메타 문자가 포함되어 있지 않으면 따옴표없이 변수 값이 표시됩니다.
  38. 내장 모드가 논리 모드에서 호출되고 경로명이 $PWD에서 구성되고 인수로 제공된 디렉토리 이름이 기존 디렉토리를 참조하지 않으면 cd이 실제 모드로 폴백하지 않고 실패합니다.
  39. pwd 내장 명령은 -P 옵션을 사용하여 파일 시스템을 확인하라는 메시지가 표시되지 않더라도 인쇄 된 값이 현재 디렉토리와 동일한 지 확인합니다.
  40. 기록을 나열 할 때 fc 내장 명령에는 기록 항목이 수정되었는지 여부가 표시되지 않습니다.
  41. fc이 사용하는 기본 편집기는 ed입니다.
  42. 유형 및 명령 내장 명령은 실행 파일이 발견 된 것으로보고하지 않지만 쉘은 $PATH에있는 유일한 이름의 파일 인 경우 해당 파일을 실행하려고 시도합니다.
  43. $VISUAL$EDITOR을 검사하는 대신 vi 편집 모드에서 'v'명령이 실행될 때 vi 편집기를 직접 호출합니다.
  44. xpg_echo 옵션을 사용하면 Bash는 echo 옵션을 해석하지 않습니다. 이스케이프 문자가 변환 된 후 각 인수가 표시됩니다.
  45. ulimit 내장자는 -c-f 옵션에 대해 512 바이트의 블록 크기를 사용합니다.
  46. SIGCHLD에 트랩을 설정할 때 SIGCHLD이 도착해도 wait 내장 명령이 중단되지 않고 즉시 반환됩니다. trap 명령은 종료되는 각 하위에 대해 한 번 실행됩니다.
관련 문제