`(backquote / backtick)는 명령에서 무엇을 의미합니까?


159

나는 다음 명령을 보았습니다.

sudo chown `id -u` /somedir

그리고 나는 궁금합니다 : `상징 의 의미는 무엇입니까 ? 예를 들어 위의 명령이 제대로 작동하지만 아래의 명령은 효과가 없다는 것을 알았습니다.

sudo chown 'id -u' /somedir

답변:


199

이것은 백틱 입니다. 백틱은 따옴표가 아닙니다. 매우 특별한 의미가 있습니다. 백틱 사이에 입력하는 모든 내용은 chown예제 와 같이 기본 명령 이전의 셸에서 평가 (실행)되며 해당 실행 의 출력 은 마치 해당 위치에서 출력을 입력하는 것처럼 해당 명령에서 사용됩니다. 명령 줄.

그래서

sudo chown `id -u` /somedir

효과적으로 실행 ( 사용자 ID 에 따라 )은 다음과 같습니다.

sudo chown 1000 /somedir
  \    \     \     \
   \    \     \     `-- the second argument to "chown" (target directory)
    \    \     `-- your user ID, which is the output of "id -u" command
     \    `-- "chown" command (change ownership of file/directory)
      `-- the "run as root" command; everything after this is run with root privileges

많은 상황에서 백틱을 사용하는 것이 좋지 않은 이유를 알아 보려면 이 질문 을 살펴보십시오 .

Btw, 예를 들어 문자열에서 백틱을 문자 그대로 사용하려면 백 슬래시 ( \)를 앞에 두어 이스케이프 처리 할 수 ​​있습니다 .


36
이것은 백틱을 잘 설명하지만 표현식을 중첩 할 수 $(your expression)있는 것과 같은 일을하는 것이 더 좋은 방법 $()입니다. 예를 들어 : 명령을 cd $(dirname $(type -P touch))포함하는 디렉토리로 cd합니다touch
Khaja Minhajuddin

11
@KhajaMinhajuddin 당신은 중첩에 대해 옳습니다- 위에서 언급 한 질문 이 자세히 다룹니다. 그러나 $()대부분의 상황에서 사용하는 것이 좋은 습관이라고 생각하지만 백틱을 더 나쁘게 만들지는 않습니다 . 실제로는 명령 줄에 입력하는 것이 훨씬 빠르다는 것을 인정해야합니다 (을 포함하여 5 번 이상에 비해 2 번의 키 입력 Shift).
rozcietrzewiacz

2
@rozcietrzewiacz 후자의 말은 아마도 대부분의 키보드에서 사실이지만 적어도 프랑스어 키보드 $( )보다 타이핑하기가 훨씬 쉽습니다 ` `.
jlliagre

1
@KhajaMinhajuddin 당신은 백틱을 중첩시킬 수 있지만, 2 레벨의 백틱을 피해야합니다.
저스틴 CB

66

여기에 몇 가지 포인트를 더 추가하고 싶습니다.

백틱 `…`은 실제로는 명령 대체 라고 합니다. 명령 대체의 목적은 백틱 내에 배치 된 명령을 평가하고 그 결과를 실제 명령에 대한 인수로 제공하는 것입니다.

명령 대체는 두 가지 방법으로 수행 할 수 있습니다. 하나는 사용 $(…)하고 다른 하나는 입니다 `…`. 둘 다 동일하게 작동하지만 $(…)형태는 현대적인 방식이며 더 명확하고 가독성이 있습니다.

그래서

sudo chown $(id -u) /somedir

다른 것보다 선호 될 수 있습니다.

여기서주의해야 할 사항 은 bash 문서 에서 언급 한 bash 인용 규칙 과의 명령 대체 관계입니다 .

큰 따옴표 안에 대체가 나타나면 단어 분리 및 파일 이름 확장이 결과에서 수행되지 않습니다.


8
또한 $(...)더 나은 둥지.
Kusalananda

$()"``"같은 방식으로 작동하지 않습니다

10

설명에 대한 한 가지 참고 사항은 거의 다루지 않았습니다.

백틱 (프랑스어 및 기타 언어에서는 공통 악센트로 두 배가되므로 그레이브라고도 함)은 표준 출력 만 대체 하지만 표준 오류는 대체 하지 않습니다.

이전 예제를 계속하려면

file `which hostname`

예상대로 작동하지만 다음과 같습니다.

file `which hostnameX`

which오류를 반환하고 그 옆에있는 명령 줄을 대신하여 출력이 표준 오류가됩니다 file. 표준 출력은 전혀 없으며 다음을 실행하여 확인할 수 있습니다.

which hostnameX

which hostnameX 2>/dev/null

이 경우

file `which hostnameX` 

파일 자체로 인해 파일 이름으로 인해 두 번째 오류 메시지 가 생성되고 번째 오류 메시지 가 생성 which hostnameX됩니다.

본질적으로 단지 다음으로 줄어 듭니다.

file

물론, 잘못된 사용법이며 사용법 오류를 반환합니다.

(직접 확인하고 싶다면 다음을 시도하십시오.

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)

4

백틱은`로 묶인 문자열의 내용을 실행합니다.

file `which hostname`

hostname 명령의 경로를 찾은 다음 빌드 방법을 알려줍니다.

질문에 입력 한 명령 id -u은 유효 사용자 ID를 얻기 위해 실행 된 다음 / somedir의 소유권을 해당 사용자로 변경합니다.


2

이 기호는 내부의 모든 것이 해당 명령의 결과로 해석됨을 의미합니다.

예를 들면 다음과 같습니다.

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three

위의 결과로 three디렉토리가 내 /home디렉토리 로 복사됩니다 .


1

백틱은 명령 대체와 유사합니다. 이 백틱 구문은 구식이며 두 개의 괄호가있는 달러 기호가 일반적이라는 것을 알고 $()있습니다.

명령 대체 란 무엇입니까?

명령 대체는 명령을 실행하고 나중에 사용하기 위해 출력을 변수에 저장하는 전용 구문을 사용하는 단일 작업입니다.

날짜가 포함 된 예 :

thedate=$(date)

그런 다음 결과를 인쇄 할 수 있습니다 : '날짜는 % s \ n' "$ thedate"`입니다.

  1. 명령 대체 구문은 $()입니다.
  2. 명령 자체는 date입니다.
  3. 두 가지를 결합하면 $(date)어떤 출력이 대체인지 ​​알 수 있습니다.
  4. printf위의 명령 에 따라 변수로 보유한 출력 값을로 표시합니다 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.