stdin 입력에는 비슷한 옵션이 있는데 명령줄 인수는 왜 흔하지 않습니까?

stdin 입력에는 비슷한 옵션이 있는데 명령줄 인수는 왜 흔하지 않습니까?

POSIX와 GNU에는 해당 옵션에 대한 구문 스타일이 있습니다. 내가 본 모든 명령에 대해 명령줄 인수로 옵션과 유사한 입력을 허용합니다.

getopt프로그램이 stdin에서 옵션과 같은 입력을 받아들이는 것이 드문 일입니까 (따라서 옵션과 같은 stdin 입력을 구문 분석하는 데 사용됩니까 )? 그것은 다음과 같습니다:

$ ls -l 
-rw-rw-r-- 1 t t 31232 Jan  7 13:38 fetch.png
-rw-rw-r-- 1 t t 69401 Feb  6 14:35 proxy.png
$ myls
> -l  
-rw-rw-r-- 1 t t 31232 Jan  7 13:38 fetch.png
-rw-rw-r-- 1 t t 69401 Feb  6 14:35 proxy.png
> -l fetch.png
-rw-rw-r-- 1 t t 31232 Jan  7 13:38 fetch.png

stdin 입력에는 비슷한 옵션이 있는데 명령줄 인수는 왜 흔하지 않습니까?

표현력 관점에서 입력과 같은 비옵션과 입력과 같은 옵션이 동일합니까(일반 언어와 문맥 없는 언어와 유사)?

쉘 확장과 같은 일이 표준 입력 입력(옵션이 아닌 경우)에서 발생하는 것을 결코 예상하거나 필요하지 않기 때문에 쉘 확장을 강조하지 않습니다.

감사해요.

비옵션(예: 입력)에 대한 유사한 질문:https://stackoverflow.com/questions/54584124/how-to-parse-non-option-command-line-arguments-and-stdin-inputs(이 글은 댓글과 반대표 부족으로 삭제되었습니다. 단, 평판이 좋으면 계속 보실 수 있습니다.)

답변1

tl;dr 이는 ls스크립트에서 사용하려는 것과 매우 유사합니다(1,2),필요할 때만 견적을 내세요또는 스트림을 가로질러(거의 문자 그대로, stdin을 사용하여 완전히 직교하는 두 가지 항목을 처리함). 이것은 나쁜 생각입니다.

이 접근 방식에는 몇 가지 문제가 있습니다.

  1. 당신의 도구는 모든 것을 처리해야합니다확장하다쉘은 이미 이를 처리합니다:
    • 버팀대 확장
    • 물결표 확장
    • 매개변수 및 변수 확장
    • 명령 대체
    • 산술 확장
    • 분사
    • 와일드카드 문자를 포함한 파일 이름 확장@StephenHarris가 지적했듯이
  2. 도구가 확장 기능을 처리할 수 없는 경우(당신이 제안한대로, 단일 매개변수 로 처리되지 않기 위해 분명히 토큰화되어야 하는 귀하가 제공한 예와는 달리 , 개발자에게 그 이유를 자세히 설명 하고 기대하는 대로 수행 -l fetch.png해야 합니다 .-l "$path"-l ~/Downloads-l 'my files'
  3. 귀하의 도구가 처리할 때쉘 이외의 확장(쉘은 확장을 다르게 처리하고 실행 중인 쉘을 아무도 감지하고 영원히 지원할 수 없기 때문에 이렇게 합니다.) 도구를 사용할 때마다 배우고, 기억하고, 사용해야 하는 새로운 구문을 방금 추가했습니다.
  4. 표준 입력은 더 이상 단순한 도구 입력이 아닙니다. 기반으로유닉스 철학,다른 도구는 입력을 도구에 전달하기 위해 특별한 작업을 수행해야 하기 때문에 더 이상 다른 도구와 함께 작동하지 않습니다.
  5. 이미 합의가 되어있습니다모든 주요 도구.이러한 근본적인 방식으로 관습을 깨는 것은 다음과 같은 측면에서 매우 나쁜 생각입니다.유효성.
  6. 믹싱 옵션 및 입력할 수 없다이는 모든 입력에 대해 안전하게 수행될 수 있습니다.그 중 하나를 인코딩하거나 이스케이프 처리하기 위해 상당한 추가 노력을 기울이지 않는 한.

답변2

많은 명령이 일반적으로 표준 입력에서 데이터를 가져오기 때문에 명령은 이를 수행하지 않습니다. 표준 입력이 옵션과 데이터의 혼합인 경우 상황이 복잡해지고 위험해집니다.

답변3

이것은매우Unix 프로그램이 표준 입력에서 명령줄 옵션을 허용하는 것은 일반적이지 않습니다.

Unix 세계에서는 파일 이름 확장("globbing")이 응용 프로그램이 아닌 호출 셸에 의해 수행되기 때문에 실제로 동작이 변경됩니다.

예를 들어, 다음과 ls *.c같이 하면껍데기*.c로 확장 file1.c file2.c되므로 실제로 실행되는 것은 입니다 ls file1.c file2.c.

표준 입력에 값이 있으면 프로그램이 이를 확장해 줍니다.

그래서... 흔하지 않을 뿐만 아니라 일반적으로 좋은 생각도 아닙니다.

프로그램이 데이터 손실을 유발하는 것은 드문 일이 아닙니다.

예를 들어

#!/bin/bash

filename=$1

if [ -z "$filename" ]
then
  read -p Filename: filename
fi

그러나 이는 표준 입력에서 명령줄 옵션을 얻는 것과는 다릅니다.

관련 정보