Linux

Echo Permission Denied(嘗試在 shell 腳本中使用 echo 而不是 ls 命令)

  • November 16, 2018

我正在嘗試編寫一個腳本,在某些時候我需要列出一個目錄中的所有東西並從該目錄中獲取一些東西。我不能用 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最後一個假設如果該運營商線上並且沒有數據,或者至少 no 1,如果不是,則文件包含一位數。

上面的循環(使用)將只從每個文件read中讀取第一行,直到找到 a 為止。carrier``1


您的程式碼中的問題是命令替換$(/sys/class/net/*),它將嘗試將第一個匹配的文件名作為命令執行,而其他匹配的文件名作為參數。

此外,只要非空,測試[ $OnLine ]就會為“真” 。$OnLine如果運營商不線上,我不確定您解析的文件包含什麼,但即使是零也會被視為“真實”。

引用自:https://unix.stackexchange.com/questions/458805