!["여기서 스크립트를 실행하세요"](https://linux55.com/image/137619/%22%EC%97%AC%EA%B8%B0%EC%84%9C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%98%EC%84%B8%EC%9A%94%22.png)
어느 시점에서 디렉토리의 모든 내용을 나열하고 해당 디렉토리에서 일부 콘텐츠를 수집해야 하는 스크립트를 작성하려고 합니다. ls로는 할 수 없어요. 나는 내가 되어야 할 사람이 아니다. 그래서 echo 명령을 사용하여 ls 작업을 수행하려고 시도했지만 이제 권한 거부 오류가 표시됩니다. 아래 스크립트를 볼 수 있습니다.
#!/bin/sh
# Test for network connection
for interface in $(echo $(/sys/class/net/*) | grep -v lo);
do
if [ "$(cat /sys/class/net/"$interface"/carrier)" = 1 ]; then
OnLine=1;
fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr;
exit;
fi
다음 오류가 발생합니다.
./carriercontrol.sh: line 10: /sys/class/net/apcli0: Permission denied
이 스크립트를 완료하려면 어떻게 해야 합니까? 디렉토리 목록을 가져와서 파이프로 연결하는 방법이 있습니까? 그리고 해당 권한을 제거할 수 있더라도 에코로 인해 더 많은 문제가 발생할 것이라고 생각합니다.
편집하다: echo를 find 명령으로 바꾸려고했는데 이것이 결과이자 오류입니다.
#!/bin/sh
# Test for network conection
for interface in $(find /sys/class/net -mindepth 1 | grep -v lo);
do
if [ "$(cat /sys/class/net/"$interface"/carrier)" = 1 ]; then
OnLine=1;
fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr;
exit;
fi
cat: can't open '/sys/class/net//sys/class/net/ra0/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/eth0/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/br-lan/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/eth0.1/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/apcli1/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/apcli0/carrier': No such file or directory
답변1
carrier
아래 파일을 쿼리하여 /sys/class/net/*/
적어도 하나가 온라인 상태(무시됨)인지 여부를 나타내는지 확인 하려는 것 같습니다 */lo/carrier
.
쉘 루프를 사용하십시오:
#!/bin/sh
online=0
for carrier in /sys/class/net/*/carrier; do
case "$carrier" in
*/lo/carrier) continue ;;
esac
if read online <"$carrier" && [ "$online" -eq 1 ]; then
break
fi
done
if [ "$online" -ne 1 ]; then
echo 'not online' >&2
exit 1
fi
사용 bash
:
#!/bin/bash
shopt -s extglob
online=0
for carrier in /sys/class/net/!(lo)/carrier; do
if read online <"$carrier" && [ "$online" -eq 1 ]; then
break
fi
done
if [ "$online" -ne 1 ]; then
echo 'not online' >&2
exit 1
fi
또는 bash
"거의 한 줄짜리" 로
#!/bin/bash
shopt -s extglob
grep -qx 1 /sys/class/net/!(lo)/carrier || ! echo not online >&2
마지막 가정은, 운영자가 온라인이면 파일에 한 자리 숫자가 포함되고 1
, 운영자가 온라인이면 데이터가 없거나 최소한 데이터가 없다는 것입니다 1
.
위의 루프(사용)는 read
a를 찾을 때까지 각 파일의 첫 번째 줄만 읽습니다.carrier
1
코드의 문제는 명령 대체입니다 $(/sys/class/net/*)
. 이는 일치하는 첫 번째 파일 이름을 명령으로 실행하고 다른 일치하는 파일 이름을 인수로 실행하려고 시도합니다.
또한 테스트는 [ $OnLine ]
비어 있지 않은 한 "true"입니다. $OnLine
연산자가 온라인이 아닌 경우 구문 분석한 파일에 무엇이 포함되어 있는지 잘 모르겠지만 여기서는 0이라도 "참"으로 간주됩니다.
답변2
이 단 하나의 라이너는 어떻습니까? 즉, grep
루프백이 명시적으로 제외되었습니다.
GNU grep
참고: GNU가 필요합니다.grep
2001년 3월 이후. 특히 grep
OpenWRT와 함께 번들로 제공되는 BusyBox 에는 적용되지 않습니다 .
grep -q --exclude '/sys/class/net/lo/carrier' 1 /sys/class/net/*/carrier || echo "not online" >&2
이전 GNU grep 버전 및 비 GNU grep을 위한 솔루션
예를 들어 BusyBox 버전입니다.
grep -x 1 /dev/null /sys/class/net/*/carrier|grep -qv /lo/ || ! echo 'not online' >&2
답변3
sudo 모드에서 위 스크립트를 실행해 볼 수 있습니다.
$sudosu