sh -c 명령은 무엇입니까?


30

나는 sh -c명령을 발견했다 . 여기에 게시하기 전에 찾았지만 Google에서 설명하는 게시물을 찾을 수 없으므로 내용이 무엇인지, 완전한 구문이 무엇인지 알고 싶습니다.

답변:


34

sh프로그램 sh을 인터프리터로 호출하고 -c플래그는이 프로그램이 해석 한대로 다음 명령을 실행하는 것을 의미합니다.

우분투에서는 sh일반적으로로 연결되어 있습니다 /bin/dash. 즉 sh -c, 대시 쉘로 명령을 실행하면 bash 대신 명령을 실행하는 데 사용됩니다. 로 호출 된 쉘 sh은 심볼릭 링크에 따라 다릅니다 readlink -e $(which sh). sh -cbash 대신 해당 셸을 사용하여 명령을 구체적으로 실행하려는 경우 사용해야합니다 .

이 구문 ( -c플래그)을 다른 인터프리터와 함께 사용할 수도 있습니다 . @edwinksl에 의해 지적 된 고전적인 사용법 중 하나는 sudo와 작동하지 않는 리디렉션 문제를 해결하는 것입니다 (여기서는 bash -c또는 사용할 수 있음 sh -c)

sudo sh -c 'echo "foo" > /home/bar'

파일 작성합니다 bar텍스트가 포함 foo에를 /home/하면서, sudo echo "foo" > /home/bar실패 여기에 아주 잘 설명 된대로

명령 문자열 주위에 '작은 따옴표'를 사용하는 것이 중요합니다. 그렇지 않으면 현재 쉘이 호출 한 인터프리터에게 전달되기 전에 확장하려고 시도합니다.

예를 들어 (대시로 다른 결과를 줄 명령을 생각할 때까지 파이썬으로 ...)

$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0

사용 방법의 예를 제공 할 수 있습니까 sh -c? -c부분에 언급 된 위치 매개 변수의 할당을 보여 주면 더 좋을 것 입니다 man sh.
edwinksl

15

-c인수는 다음과 같습니다

표준 입력 대신 command_string 피연산자에서 명령을 읽습니다. 특수 매개 변수 0은 command_name 피연산자에서 설정되고 위치 매개 변수 ($ 1, $ 2 등)는 나머지 인수 피연산자에서 설정됩니다.

shArugment 의 다른 세부 사항은 다음 을 실행하여 찾을 수 있습니다.

$ man sh

문자열을 인수로 사용하는 예는 다음과 같습니다.

$ sh -c "echo This is a test string"

더 자세한 sh -c예입니다. Google 드라이브에서 문서를 다운로드하여 바탕 화면에서 편집 할 수 있도록 엽니 다.

$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"

11

sh -c( 우분투에서) 로그인 , 비 대화식 세션을 생성합니다 .shdash

그 쉘 세션에서 실행 될 명령 다음, 그것은 0 (인수 (위치 파라미터)로서 취급한다 ARGV0), 그 명령의 인수 (와 나머지 부 ARGV0(1)로부터 시작하여, () ARGV1, ARGV2...).

이러한 종류의 세션에서 실행되도록 허용 된 일반적인 쉘 기능 (예 : ;여러 명령을 사용하는 명령 분리,을 사용한 명령 그룹화,을 사용하여 {}다른 서브 쉘 생성) ()등을 사용할 수도 있습니다. 이들을 사용하면 앞에서 언급 한 인수 정의 / 예를 약간 변경할 수 있습니다.


그냥 참고로, 특정 수있는 기능 대화 형 전용 (기본적으로) 쉘, 예를 들어 역사 확장, source의 -ing ~/.bashrc하고 /etc/bash.bashrc그대로 등이 세션에서 사용할 수 없습니다 비대화 형 . 다음 -i옵션 을 사용하여 대화식 세션 동작 (거의)을 시뮬레이션 할 수 있습니다 .

sh -ic ...

마찬가지로 로그인 쉘 전용 (기본적으로)과 같은 기능 ( 예 : source- ~/.profile제공 ~/.bash_profile~/.bash_login존재하지 않음) /etc/profile은 쉘이 비 로그인 쉘 이므로 수행되지 않습니다 . 다음 -l옵션을 사용하여 로그인 쉘 동작을 시뮬레이션 할 수 있습니다 .

sh -lc ...

로그인 및 대화식 세션을 모두 시뮬레이트하려면 다음을 수행하십시오.

sh -lic ...

+1 "sh -c는 로그인하지 않은 비 대화식 sh 세션을 생성합니다"
JSON C11
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.