ある時点で、ディレクトリのすべての内容を一覧表示し、そのディレクトリから一部のコンテンツを収集する必要があるスクリプトを作成しようとしています。 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/*/
少なくとも1つがオンライン(無視)かどうかを示すかどうかを確認したいようです*/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
、オペレータがオンラインの場合はデータがないか、少なくともデータがないことです1
。
上記のループ(使用)は、read
aが見つかるまで各ファイルの最初の行だけを読み取ります。carrier
1
コードの問題はコマンドの置き換えです$(/sys/class/net/*)
。これは、一致する最初のファイル名をコマンドとして実行し、別の一致するファイル名を引数として実行しようとします。
また、テストは[ $OnLine ]
空でない限り「真」です。$OnLine
演算子がオンラインでない場合、解析したファイルに何が含まれているのかわかりませんが、ここではゼロでも「真」と見なされます。
答え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