스크립트를 실행할 때 어떤 SHELL이 사용되었는지 어떻게 알 수 있나요? [복사]

스크립트를 실행할 때 어떤 SHELL이 사용되었는지 어떻게 알 수 있나요? [복사]

스크립트를 실행하는 데 사용되는 쉘을 어떻게 출력합니까?

예: $SHELL 변수는 특정 사용자에게 기본 셸을 제공합니다. 괜찮습니다. 하지만 특정 사용자는 다른 셸을 사용하여 스크립트를 시작할 수 있습니다(예: "sh script.sh" 또는 "csh script.sh").

Linux 머신을 사용하세요.

답변1

Linux를 지정했으므로 이는 작동합니다 readlink -f /proc/$$/exe. 이는 표준 출력에서 ​​쉘 스크립트(예: /bin/bash)를 실행하는 쉘에 대한 경로를 제공합니다. 따라서 이를 변수에 할당할 수 있습니다(적어도 POSIX 쉘에서는) var=$(readlink -f /proc/$$/exe).

$$현재 쉘의 pid입니다. /proc/«pid»/exe"마법의" 심볼릭 링크 형태로 특정 pid에서 실행 중인 실행 파일을 쿼리할 수 있는 커널 기능입니다. 따라서 readlink를 사용하여 경로를 얻을 수 있습니다.

psLinux가 아닌 경우에는 eg를 사용할 수 있지만 ps -o args= $$이로 인해 결국 스크립트 이름이 제공될 수 있습니다(POSIX에서는 두 가지 동작을 모두 허용합니다).

예를 들어 스크립트가 사용자의 셸에 변수를 설정하도록 설계되지 않은 경우 #!맨 위 줄을 사용하여 스크립트를 실행할 셸을 지정해야 합니다.

답변2

독립형 스크립트는 실행 중인 인터프리터를 테스트해서는 안 됩니다. 이러한 자체 검사는 어색하고 오류가 발생하기 쉬우며 Unices마다 다르게 구현해야 할 수도 있습니다.

예를 들어, Perl 스크립트는 Perl 인터프리터에 의해 해석되고 있다고 항상 안전하게 가정할 수 있고, Python 스크립트는 항상 Python 인터프리터에 의해 실행될 수 있습니다. 그렇다면 스크립트가 bash에 의해 실행되고 bash있고 sh스크립트가 에 의해 실행되고 있다고 가정하면 안되는 이유는 무엇입니까 /bin/sh?

특정 테스트능력bash현재 인터프리터의 문제는 배열 버전을 제공 $BASH_VERSION하고 테스트하는 것과는 다릅니다 $BASH_VERSINFO(예를 들어).

bash그렇다면 실행할 스크립트 bashcsh실행할 스크립트를 어떻게 얻습니까 csh? 글쎄, 사용자가 통역사를 선택하는 것을 피할 수 있습니다.

당신은 이것을 할 수 있습니다

  • 사용자 혼란을 방지하려면 스크립트 파일에 파일 이름 접미사를 추가하지 마십시오. 파일 bash의 스크립트는 myscript.sh사용자가 그것이 사용 가능하다고 생각하게 만들 수 있습니다 sh. 대신 스크립트를 호출하면 됩니다 myscript.

  • #!("shebang" 또는 "hashbang") 줄을 사용하세요 .

-line은 #!스크립트의 첫 번째 줄에 있으며(이 두 문자는 #!파일의 첫 번째 문자여야 함) 사용할 인터프리터의 경로를 지정합니다.

스크립트 bash에는 다음이 있을 수 있습니다.

#!/bin/bash

bash이것이 시스템의 실행 파일에 대한 경로이거나 bash시스템의 어느 위치에서든 가져오려는 경우,$PATH

#!/usr/bin/env bash

예를 들어 첫 번째 줄입니다.

이렇게 하면 관련되지 않은 다른 언어 해석기 에 의해 해석되거나 해석 bash되지 않도록 항상 보장됩니다.shcshpython

다음 단계는

  • 스크립트를 실행 가능하게 만드는 데 사용됩니다 chmod +x myscript.

이제 스크립트를 실행할 수 있습니다

./myscript

이를 실행하는 데 어떤 통역사를 사용하는지 걱정하지 마십시오. 사실 스크립트 사용자에게는 중요하지 않습니다.별말씀을요bash스크립트 든, Python 스크립트든, 컴파일된 바이너리든 상관없습니다 .

관련 정보