fping
명령줄 인수 순서에 따라 항상 순차적 인 결과를 얻고 싶습니다 .
예를 들어 다음 명령은 다음과 같습니다.
fping -e 151.101.129.164 8.8.8.8
다음과 같은 결과가 나올 수 있습니다.
8.8.8.8 is alive (5.43 ms)
151.101.129.164 is alive (63.2 ms)
위의 결과는 명령에 대한 인수와 순서가 다릅니다 fping
. 여기서 는 명령 151.101.129.164
에 첫 번째로 배치되지만 fping
결과는 두 번째로 표시됩니다.
151.101.129.164
첫 번째 fping 명령의 순서를 변경하지 않고 어떻게 결과를 먼저 표시할 수 있습니까 ?
답변1
한 가지 방법은 래퍼 스크립트를 작성하는 것입니다.
#!/bin/sh
myfile=$(mktemp)
fping "$@" > "$myfile"
for arg
do
case "$arg" in
(-*) # Ignore options
;;
(*) grep "^$arg " "$myfile"
esac
done
rm "$myfile"
따라서 이것을 호출 myfping
하고 실행 하면( PATH에 있는 디렉터리에 스크립트를 myfping -e 151.101.129.164 8.8.8.8
추가하거나 넣어야 함 ) 실행됩니다../
fping -e 151.101.129.164 8.8.8.8임시 파일로 출력한 다음 명령줄(왼쪽에서 오른쪽) 순서로 인수를 검토하고 결과를 순서대로 가져옵니다.
노트:
IPv4 주소 구문 분석기는 매우 유연합니다. 대부분의 (전부는 아니지만) 시스템에서
127.0.1
와 동등한 것으로 해석됩니다127.0.0.1
. 따라서 ,fping 127.0.1
및 가fping
시작하는 출력 행을 생성하고127.0.1
와 같은 인수도 있는 경우1.7.0.1
이는 와 일치하는 정규식으로 처리됩니다127.0.1
. 다음과 같이 이를 극복할 수 있습니다.#!/bin/bash myfile=$(mktemp) ./fping "$@" > "$myfile" for arg do case "$arg" in (-*) # Ignore options ;; (*) darg=$(sed 's/\./\\./g' <<< "$arg") grep "^$darg " "$myfile" esac done rm "$myfile"
of 는
arg
of 로1.7.0.1
변환되며 이는 일치하지 않습니다 .darg
1\.7\.0\.1
127.0.1
위 스크립트는 "여기 문자열"( ) 때문에 bash에만 해당됩니다
<<< "$arg"
.darg=
행을 다음으로 변경하여 POSIX 호환으로 만들 수 있습니다.darg=$(printf "%s" "$arg" | sed 's/\./\\./g')
- 위의 내용은 붉은 청어일 수 있습니다. 당신이
fping 127.0.1
그렇다면fping
~할 것 같다주소를 정규화하고 결과를 보고합니다127.0.0.1
. 그러면 그 사람은grep
그걸 못 찾을 거예요. 아니면 아닐 수도 있습니다. 의 버전을 확인하세요fping
. - 또는 같은 인수가 있는 옵션을 사용하는 경우 내 스크립트의 논리 는 옵션 인수를 일반 인수인 것처럼 처리합니다. 즉, 대상 호스트 이름/주소입니다. 이것은 아마도 중요하지 않을 것입니다.
-c count
-I interface
case
*
,[
…]
또는 기타 특수 문자가 포함된 인수가 있는 경우grep
예기치 않은 결과가 발생할 수 있습니다. 실생활에서 문제가 될 가능성은 없을 것 같습니다.- 대상 호스트 이름/주소 인수에 해당하지 않는 정보를 출력 하면
fping
해당 정보가 표시되지 않습니다. - 이 스크립트는 의 종료 상태로 종료되지 않습니다
fping
. 이를 고치는 것은 연습문제로 남았습니다.