하나의 명령이 다른 명령 내에서 사용됨

하나의 명령이 다른 명령 내에서 사용됨

djvused 명령에는 다음 옵션이 있습니다.

-e 명령

djv가 옵션 인수 명령에 지정된 명령을 실행하는 데 사용됩니다. 불필요한 쉘 확장을 방지하기 위해 djvused 명령을 작은따옴표로 묶는 것이 좋습니다.

예를 들어, djvused myfile.djvu -e 'print-pure-txt'.

나에게 특이한 점은 하나의 명령(여기서는 djvused)이 다른 명령( -e여기서는 옵션)을 실행할 수 있다는 것입니다. 이것이 어떻게 가능한지 궁금합니다. 이것이 명령줄 인터페이스에서 일반적인 관행입니까?

이는 awk 명령에 사용된 인쇄 명령과 유사합니까?

내가 아는 한 명령이 다른 명령 내에서 사용되는 유일한 방법은 다음과 같습니다.

echo `echo hello`

감사드립니다!

답변1

이는 매우 일반적이어서 일부 프로그램은 이 방식으로만 작동합니다.

마음속에 떠오르는 보다 일반적인 예는 다음 su과 같습니다.sudoxterm

su -c 'ls -l /root'
sudo ls -l root
xterm -e 'top -d 10'

당신의 예와는 다릅니다

echo `echo hello`

백틱은 쉘에 의해 해석되며 프로그램 자체는 아무 작업도 수행하지 않습니다.

su또한 와 의 차이점에 유의하세요 sudo. 첫 번째는 확장 변수와 같이 사용자 관점에서 설정하기 어려울 수 있는 문자열을 사용합니다.앞으로명령을 통해 확인할 수 있습니다. 두 번째 명령은 일련의 문자열이며 훨씬 간단합니다(예제에는 따옴표가 없음 sudo).

내부 작업을 구현하기 위해 무엇을 사용합니까? 기본적으로 system라이브러리 루틴과 exec시스템 호출 이라는 두 가지 방법이 있습니다 . 첫 번째는 쉘을 호출하고 다음과 같은 다양한 쉘 확장을 허용합니다.

su -c 'ls -ld /root/.*'

두 번째 접근 방식은 이러한 자유를 허용하지 않습니다.

답변2

백틱은 중첩하기 어렵고 다른 글꼴의 아포스트로피와 쉽게 구별되지 않기 때문에 더 이상 사용되지 않습니다.

대신 $(cmd)를 사용하세요. 이는 간단합니다.

echo $(echo $(echo $(echo $(echo $(echo hello)))))

예, 거의 사용되지 않더라도 자주 필요한 기능입니다.

그러나 명령을 처리하지만 반드시 스스로를 다시 호출하지는 않는 수많은 프로그램이 있습니다.

  • 물론 Shell은 bash, dash, zsh그것을 좋아합니다.
  • 모든 스크립트 가능한 언어(예:scala, haskell, ruby, python, lua, perl, php, ...
  • 보다 구체적인 언어, 예:bc, r, ...
  • SQL 인터페이스는 다음과 같습니다psql -c "SELECT foo FROM bar" sampledb
  • 원격 쉘 등ssh, telnet, ...

답변3

최고의 Vim 텍스트 편집기인 이전 vi에는 다음 기능이 있습니다.

커서가 빈 줄에 있고 !)date를 입력하면 명령의 출력이 date빈 줄에 배치됩니다.

나는 타임스탬프가 표시된 항목을 얻기 위해 메모로 가득 찬 파일이나 작업 목록에 추가할 때 이 작은 순서를 사용합니다.

Vim에서는 텍스트 단락의 첫 번째 줄에 커서를 놓고 V를 누른 다음 j를 사용하여 한 번에 한 줄씩 아래로 단락의 마지막 줄로 이동할 수 있습니다. !fmt를 클릭하고 텍스트 서식을 80개 미만의 행과 열로 지정하세요. Vim은 마커를 강조 표시하지만 이전 vi 버전의 일반적인 트릭인 변형은 마커만 강조 표시합니다: 'a,'b!fmt

좀 더 기술적인 문제는 다양한 방법으로 처리할 수 있습니다. C 표준 라이브러리 호출은 system(3)외부 명령을 실행하는 일반적인 방법입니다. 해당 표준 라이브러리 호출은 수행하려는 작업에 대해 너무 많은 가정을 부과할 수 있습니다. 이 경우 시스템 fork(2)호출을 사용하여 파일 설명자 등을 변경하는 새 프로세스를 가져온 다음 execve(2)시스템 호출을 호출하여 커널을 생성합니다. 다른 실행 파일을 새 프로세스의 주소 공간에 로드합니다.

이는 다른 명령과 함께 재사용할 수 있기 때문에 명령줄 프로그램에서 비교적 일반적으로 수행되는 작업입니다.

관련 정보