Bash 명령: 매개변수를 사용자 정의 명령(함수) 이전에 전달할 수 있습니까, 아니면 다음 이후에만 전달할 수 있습니까?

Bash 명령: 매개변수를 사용자 정의 명령(함수) 이전에 전달할 수 있습니까, 아니면 다음 이후에만 전달할 수 있습니까?

명령 전에 사용자 지정 명령에 인수를 전달할 수 있는지 궁금합니다.

ping사용자 정의 명령이 있고 명령 앞에 IP 주소를 전달하고 싶다고 가정해 보겠습니다 .

반대로 ?ping 1.1.1.11.1.1.1 ping

미리 감사드립니다

답변1

이는 다음 예에서 작동합니다 ping.

echo 1.1.1.1 | xargs ping

명령 앞의 매개변수

답변2

이것은 약간 번거롭지만 대부분 작동하는 것 같습니다.

cmd_handler() {
    eval "cmd_words=($BASH_COMMAND)"
    last_word="${cmd_words[@]: -1:1}"
    if [ "$last_word" = gnip ]
    then
        argcm1=$((${#cmd_words[@]}-1))
        ping "${cmd_words[@]:0:$argcm1}"
        return 1
    fi
}
shopt -s extdebug
trap cmd_handler debug

분명히 처음 10줄은 이라는 함수를 정의합니다 cmd_handler. 이 trap cmd_handler debug명령은 cmd_handler입력하는 모든 명령에 대해 bash가 호출되어야 함을 지정합니다. 예를 들어 사용자가 입력하는 명령은 변수의 함수에 1.1.1.1 ping사용할 수 있습니다 $BASH_COMMAND. 이것은 스칼라 문자열이므로 cmd_words=($BASH_COMMAND)단어로 분할합니다. 이로 인해 가상의 명령이 생성됩니다.

ls -l This is "Super User".

6개의 문자로 구분됩니다.

  • ls
  • -l
  • This
  • is
  • "Super, 그리고
  • User".

그래서 우리는 이를 eval쉘이 인용문을 해석하도록 하는 데 사용합니다. 이 구성은 다음을 생성합니다.${array_name[@]:offset:length}length로 시작하는 배열 멤버입니다. 하나${array_name[offset]}offset-1은 마지막 요소를 참조하므로 이름에서 알 수 있듯이 명령의 마지막 단어로 평가됩니다. 말한 내용과 다르게 표시되도록 공백을 포함하세요. 이것이 사용자 정의 명령의 이름인 경우(테스트 목적으로 그렇게 표현했습니다) 인수 수에서 1( )을 뺀 값을 계산하고 마지막 단어를 제외한 모든 명령을 인수로 실행합니다. 일반적인 구문 분석을 통해 이 명령을 처리하지 않도록 쉘에 지시합니다.:-gnipargcm1pingreturn 1

몇 가지 결함과 해결 방법을 찾았습니다.

  • 분명히 이것은 처리될 수 없습니다 1.1.1.1 gnip -n 4 -w 500.
    • 그것은 그것을 처리할 것입니다 1.1.1.1 -n 4 -w 500 gnip.
    • cmd_handler 명령줄의 모든 단어를 검사하여 사용자 정의 명령의 이름을 찾도록 수정할 수 있습니다 .
  • 1.1.1.1 gnip > ping.outcmd_handler마지막 문장이 표시되므로 작동하지 않습니다 ping.out. 당신은 그것을 사용할 수 있습니다

    • (1.1.1.1 gnip) > ping.out또는
    • { 1.1.1.1 gnip;} > ping.out

    첫 번째는 하위 쉘에서 명령을 실행하지만 두 번째는 그렇지 않습니다. 두 번째 양식 뒤에는 공백이 필요 하고 { 앞에는 세미콜론( ;)이 필요하다는 점을 기억하세요 }.

  • 1.1.1.1 gnip | some other command작동하지 않으며 왜 작동하지 않는지 이해하지 못합니다. 명령을 기본 셸에서 실행하려는지 말하거나 다른 형식을 사용하여 이 문제를 해결하면 이 문제를 해결할 수 있습니다.(1.1.1.1 gnip) > >(some other command){ 1.1.1.1 gnip;} > >(some other command)

제가 아직 발견하지 못한 다른 함정이 있을 수도 있습니다.

관련 정보