Linux
Echo Permission Denied(嘗試在 shell 腳本中使用 echo 而不是 ls 命令)
我正在嘗試編寫一個腳本,在某些時候我需要列出一個目錄中的所有東西並從該目錄中獲取一些東西。我不能用 ls 做到這一點。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
我能做些什麼來完成這個腳本?有沒有辦法獲取目錄列表並用管道傳輸它。即使我可以擺脫該許可,我認為迴聲會給我帶來更多麻煩。
編輯: 我試圖用 find 命令替換 echo ,這是結果和錯誤。
#!/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
您似乎想查詢下面的
carrier
文件/sys/class/net/*/
以查看是否至少有一個指示您是否線上(忽略*/lo/carrier
)。使用 shell 循環:
#!/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
最後一個假設如果該運營商線上並且沒有數據,或者至少 no1
,如果不是,則文件包含一位數。上面的循環(使用)將只從每個文件
read
中讀取第一行,直到找到 a 為止。carrier``1
您的程式碼中的問題是命令替換
$(/sys/class/net/*)
,它將嘗試將第一個匹配的文件名作為命令執行,而其他匹配的文件名作為參數。此外,只要非空,測試
[ $OnLine ]
就會為“真” 。$OnLine
如果運營商不線上,我不確定您解析的文件包含什麼,但即使是零也會被視為“真實”。