![Bash 명령: 매개변수를 사용자 정의 명령(함수) 이전에 전달할 수 있습니까, 아니면 다음 이후에만 전달할 수 있습니까?](https://linux55.com/image/61126/Bash%20%EB%AA%85%EB%A0%B9%3A%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%82%AC%EC%9A%A9%EC%9E%90%20%EC%A0%95%EC%9D%98%20%EB%AA%85%EB%A0%B9(%ED%95%A8%EC%88%98)%20%EC%9D%B4%EC%A0%84%EC%97%90%20%EC%A0%84%EB%8B%AC%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%2C%20%EC%95%84%EB%8B%88%EB%A9%B4%20%EB%8B%A4%EC%9D%8C%20%EC%9D%B4%ED%9B%84%EC%97%90%EB%A7%8C%20%EC%A0%84%EB%8B%AC%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
명령 전에 사용자 지정 명령에 인수를 전달할 수 있는지 궁금합니다.
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)
제가 아직 발견하지 못한 다른 함정이 있을 수도 있습니다.