많은 명령이 "자동"옵션을 제공하는 이유는 무엇입니까?


37

표준 출력을 널 파일로 경로 재지 정하여 동일한 결과를 쉽게 얻을 수있을 때 많은 명령이 옵션을 제공 -q하거나 --quiet출력을 억제 하는 이유는 무엇 입니까?


3
나는 주로 편의 플래그로 생각합니다.
Janis

7
모든 명령이 모든 출력 -q을 억제 하는 데 사용 하는 것은 아닙니다 . 예를 들어 Docker에는 이미지를 나열하는 명령이 있습니다. 는 정보가 많은 형식화 된 테이블을 표시하고 이미지 ID의 일반 목록 을 출력합니다 (다른 명령으로 파이프하는 데 유용함). docker imagesdocker images -q
new123456

답변:


71
  • 쉘에서 쉽게 재 지정할 수 있지만 쉘 명령 행을 사용하지 않고 다른 언어로 명령을 실행할 때처럼 쉽지 않은 다른 컨텍스트가 있습니다. 껍질에서도 :

    find . -type f -exec grep -q foo {} \; -printf '%s\n'

    포함 된 모든 파일의 크기를 인쇄합니다 foo. 로 리디렉션하면 출력 과 출력이 /dev/null모두 손실됩니다 . 당신은 의지해야합니다 (즉, 여분의 껍질을 생성하십시오).findgrep-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;

  • grep -q foo 입력하기보다 짧다 grep foo > /dev/null
  • 방향 전환 /dev/null은 출력이 여전히 쓰여지고 버려지는 것을 의미합니다. 출력을 쓰지 않는 것보다 비효율적입니다.
  • 추가 최적화가 가능합니다. 의 경우 grep와 이후 예를 들어 -q, grep그것은 첫 경기를 발견로 출력이 필요하지 않습니다 알고, 그것을 즉시 종료됩니다. 를 사용하면 grep > /dev/null여전히 모든 일치 항목을 찾으려고 시도합니다.
  • 조용한 것이 반드시 침묵을 의미 하는 것은 아닙니다 . 일부 명령의 경우 자세한 표시를 줄입니다 (의 반대 -v|--verbose). 예를 들어 mplayera --quiet와 a가 --really-quiet있습니다. 일부 명령을 사용 -qqq하면 세부 정보를 3 번 ​​줄일 수 있습니다 .

에 있다는 것은의 주목할만한 grep사람이 페이지 두 옵션, -q그리고 -s휴대 성이 문제가되는 경우, 제안은 피해야합니다. grep초기 종료는 중요한 최적화이지만 이러한 옵션을 가진 모든 프로그램이 그렇게 할 수있는 것은 아닙니다. curl -s여전히 전체 데이터를 처리합니다 (그러나 세 번째 포인트는 여전히 적용되므로 처리 시간이 절약됩니다).
Janis

6
@Janis, 그것은 매우 오래된 시스템으로의 이식성이 될 것입니다. 모두 -q-sPOSIX에 의해 지정됩니다. 우리가 오래된 시스템을 고려한다면, 저도 sh -c '...' sh {} \;작동하지 않습니다 (이전 ksh기반 sh의 s).
Stéphane Chazelas

매뉴얼 페이지에는 USG 스타일 grep에도 -q가 없지만 -s 옵션은 GNU grep처럼 동작했습니다. -행동의 차이가 문제가 될 수 있다고 생각했습니다. 그 관련성에 대해 판단 할 수 없습니다.
Janis

스크립트에서 명령의 리턴 코드 만 신경 쓰면 -q 및 --quiet 옵션을 자주 사용합니다. 위에서 언급 한 이유는 더 좋은 예입니다.
마크 스튜어트

@ StéphaneChazelas : 당신은 (의 일부) 많은 시스템이 오래된 ... (음, 사실, 많은 ^^하지만 거기에 여전히) 여전히 얼마나 놀랄 것
올리비에 Dulac

3

화면에 메모해야 할 때 명령을 내릴 수는 있지만 일반적으로 아무것도 출력하지 않습니다. all을 null로 리디렉션하면 출력을 볼 가능성이 없습니다.


음, 조용히 응답이 예상되지 않습니다; 어쨌든 출력이 표시되면 예상치 못한 결과가 발생합니다. (어쨌든 터미널 연결 프로세스에서 인쇄하는 데 "실제로 정말로 중요한"무언가가있는 경우 프로세스에서 tty / pty 장치를 직접 사용할 수 있습니다. 이에 대한 예는 대화식으로 비밀번호를 조회하는 것일 수 있습니다. )
Janis

2

명령에 따라 다르지만에 대한 -q출력도 비활성화합니다 stderr. 이것은 잡음을 피하기 위해 stderr를 stdout에 쉽게 넣을 수없는 쉘을 허용합니다 (나는 당신을보고 있습니다 csh& & tcsh).

일부 프로그램은 상태 메시지가 혼동되기를 원하지 않는 다른 의미있는 출력이있을 수있는 상황에 대해 "자동"옵션을 제공합니다. -q또는 이와 동등한 말에서 순수한 데이터 스트림을 허용, 모든 프로그램 상태 출력을 침묵 것 targzip.


0

위의 모든 좋은 반응과 요점 외에. 모든 플래그에 반대 옵션을 제공하는 것이 가장 좋습니다. 따라서 자세한 정보 표시에 -v가 있으면 비 상세 정보, 꽤 또는 침묵의 경우 -q가 있어야합니다. (이것은 논의의 핵심은 아니지만 ...) 짧은 모든 -q와 --quite에 대한 긴 옵션이어야합니다.

비즈니스의 거의 모든 것과 마찬가지로 솔루션이나 동일한 결과를 얻는 방법은 여러 가지가 있습니다. -q를 갖는 것이 그중 하나입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.