명령 전에 사용자 지정 명령에 인수를 전달할 수 있는지 궁금합니다.
ping
사용자 정의 명령이 있고 명령 앞에 IP 주소를 전달하고 싶다고 가정해 보겠습니다 .
반대로 ?ping 1.1.1.1
1.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( )을 뺀 값을 계산하고 마지막 단어를 제외한 모든 명령을 인수로 실행합니다. 일반적인 구문 분석을 통해 이 명령을 처리하지 않도록 쉘에 지시합니다.…:-…
gnip
argcm1
ping
return 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.out
cmd_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)
제가 아직 발견하지 못한 다른 함정이 있을 수도 있습니다.