sh -x와 ./ 실행 스크립트의 차이점

sh -x와 ./ 실행 스크립트의 차이점

그래서 간단한 쉘 스크립트가 있습니다. 실행될 때 이 두 명령의 차이점은 무엇입니까? 선호하는 방법이 있나요?

$sh -x foobar.sh

또는

$ ./foobar.sh

두 번째 명령과 함께 사용할 때 스크립트가 더 느리게 실행되는 것을 발견했습니다.

답변1

파일은 ./foobar.sh#!번째 줄 이후에 무엇이든 실행하여 시작됩니다. 이 줄을 읽으면 #!/bin/sh -x사례와 동일합니다 (sh가 PATH에서 오는 sh -x foobar.sh것으로 확인한다고 가정 ). 아마도 a로 시작 /bin/sh하지 않았을 수도 있지만 ?shbash

-x플래그는 실행 전에 각 명령에 대한 디버깅 정보를 인쇄합니다.

답변2

이는 쉘 스크립트의 내용과 사용된 쉘에 따라 다릅니다. 쉘 스크립트에는 다음이 포함될 수 있습니다.상용구 코드, 다음과 같이 shebang이라고 합니다.

#!/usr/bin/env bash

특수 시퀀스 "#!"은 exec() 커널 시스템 호출에 바로 뒤에 정의된 프로그램을 인터프리터로 사용하도록 지시합니다. 즉, 두 번째 실행 방법을 사용하는 경우 해당 파일을 실행하는 데 어떤 프로그램이 사용되는지 확인하려면 파일을 살펴봐야 합니다.

또한 bash 매뉴얼(bash -c "helpset")에서

-x  Print commands and their arguments as they are executed.

명령으로 수행할 작업 - bash를 사용하는 경우 아래 설명을 참조하세요. 스크립트의 각 줄을 인쇄하고 실행하세요. 이상하게도 이로 인해 첫 번째 명령이 두 번째 명령보다 느려집니다. 그 반대는 아닙니다(다시 말하지만 두 경우 모두 동일한 인터프리터가 사용되는 경우). 물론 디버깅을 원하지 않는 한 -x 없이 쉘을 실행하는 것이 더 일반적입니다.

결론: 명시된 이유 때문에여기env 프로그램과 함께 shebang을 사용하십시오(권장 사항)여기) 두 번째 실행 방법을 사용하십시오. 이는 가장 플랫폼 독립적인 작업 방식이자 선호되는 방식입니다.

참고: 상황을 복잡하게 만드는 또 다른 점은 /bin/sh 뒤에 있는 실제 해석기가 시스템마다 다르다는 것입니다. 많은 경우에 이것은 실제로 bash입니다. 그것이 제가 가정하는 것입니다.

답변3

첫 번째 버전인 명시적 호출은 shsh를 사용하여 스크립트를 실행합니다(필요에 따라 추적 명령문 표시 -x). 두 번째는 명시적인 인터프리터를 지정하지 않고 shebang 줄(있는 경우)을 따르거나 현재 실행 중인 셸을 기본값으로 사용합니다.

예를 들어 스크립트에 shebang line이 있거나 #! /bin/bash쉘이 bash인 경우 두 번째 양식을 사용하면 ./scriptsh 대신 bash가 실행됩니다. bash는 sh보다 더 많은 기능을 갖춘 쉘이기 때문에 성능 특성이 다를 수 있습니다.

관련 정보