터미널에서 인수를 전달하고 로그에 캡처하려면 getopts'를 사용해 보세요.

터미널에서 인수를 전달하고 로그에 캡처하려면 getopts'를 사용해 보세요.

터미널의 명령 문자열에서 인수를 전달하려고 합니다. 이 명령을 감지하고 사용자가 스크립트가 수행하는 작업을 볼 수 있도록 스크립트를 수정하고 있습니다.

이것이 내가 감지하고 싶은 것입니다.

[root@linuxtest] ./testscript.sh $1 -v

이 명령은 터미널에서 스크립트가 수행하는 작업을 자세히 설명하고 이를 로그 파일에 기록합니다. 이제 사용자에 따라 스크립트는 사용자가 입력한 명령을 감지합니다.

sh testscript.sh $1 -v

또는

./teshscript.sh -v

이제 스크립트에는 이미 다음 명령이 있습니다.

1> {로그} 2>&1을 실행합니다.

이를 통해 에코를 파일에 기록할 수 있습니다. 그러나 이는 터미널에 표시되지 않고 {LOG} 파일이 저장된 경로에 관계없이 텍스트 파일에 기록됩니다. 내가 지금 가지고 있는 것은 이것입니다:

name=`sh testscipt.sh $1 -v`

if [[ -n "$name" ]]; then
   2>&1 2>&- | tee -a ${LOG}
else
   1> {LOG} 2>&1
fi

그러나 언제 설정해야 하는지에 대한 논리가 무엇인지 잘 모르겠습니다. 이것을 허용하기 위해 "getops"를 조사했지만 구문이 무엇인지 잘 모르겠습니다. 따라서 본질적으로 사용자가 실행할 수 있도록 허용하려고 하지만 사용자가 이를 보려면 터미널에서 에코를 보려면 해당 명령을 입력해야 합니다.

getops/case를 스위치로 사용하고 사용자가 명령을 입력할 때 감지될 매개변수를 전달하는 올바른 방법은 무엇입니까?

답변1

리디렉션과 파이프는 명령의 일부가 아닙니다. 파이프의 구조입니다.~ 사이주문하다. 따라서 표준 출력 또는 표준 오류를 리디렉션하기 위한 인수를 찾기 위해 명령줄 인수를 볼 수 없습니다.

그러나 (표준 입력), (표준 출력) 및 (표준 오류) /proc/$$/fd가 에 링크되어 있는지 보고 확인할 수 있습니다.012

$ cat foo.sh
#!/bin/bash
echo "My pid is $$"
ls -l /proc/$$/fd/
$ ./foo.sh 2> /tmp/errorsgohere
My pid is 30842
total 0
lrwx------ 1 username username 64 Jun 28 14:33 0 -> /dev/pts/0
lrwx------ 1 username username 64 Jun 28 14:33 1 -> /dev/pts/0
l-wx------ 1 username username 64 Jun 28 14:33 2 -> /tmp/errorsgohere
lr-x------ 1 username username 64 Jun 28 14:33 255 -> /home/username/foo.sh

관련 정보