2013-07-01 118 views
3

我不理解這是如何不起作用:擊:變量文件路徑

ls /sys/class/net/wlan0 
addr_assign_type broadcast device flags iflink  netdev_group queues 
subsystem uevent addr_len carrier dormant ifalias link_mode **operstate** 
speed tx_queue_len address dev_id duplex ifindex mtu power statistics 


for f in $(ls /sys/class/net/); do $(cat /sys/class/net/${f}/operstate); done 
cat: /sys/class/net/eth0/operstate: No such file or directory 
cat: /sys/class/net/lo/operstate: No such file or directory 
cat: /sys/class/net/wlan0/operstate: No such file or directory 

我猜$ F沒有及時擴大了cat。我嘗試了引號,例如「$ f」,但仍然無效。

這樣確實OK:

for f in $(ls /sys/class/net/); do echo /sys/class/net/${f}/operstate; done 
/sys/class/net/eth0/operstate 
/sys/class/net/lo/operstate 
/sys/class/net/wlan0/operstate 

和:

cat /sys/class/net/eth0/operstate 
up 

有什麼我錯過了?爲什麼cat看不到循環中的文件?

+0

'echo'不關心它的參數是否存在於文件系統中。 –

+0

在/ sys/class/net/wlan0/operstate上執行ls -l – Owen

+0

到其他設備(硬件名稱)的文件鏈接,但是'cat'確實有效? – Edouard

回答

2

首先,您不應該在循環內部重複/sys/class/net/,因爲$f已經包含這些目錄。

for f in $(ls /sys/class/net/); do $(cat ${f}/operstate); done 

接下來,$(...)裏面的循環需要去。沒有必要捕捉貓的輸出。

for f in $(ls /sys/class/net/); do cat ${f}/operstate; done 

現在$(ls ...)可以免掉一個簡單的通配符:

for f in /sys/class/net/*; do cat ${f}/operstate; done 

最後,整個循環可以與貓單個呼叫代替。

cat /sys/class/net/*/operstate 
+0

謝謝。爲什麼'貓'失敗?因爲錯誤的道路? – Edouard

+0

@愛德華我真的不知道。這是你的shell的確切輸出嗎?那些看起來不正確的錯誤信息。我會期望'cat:/ sys/class/net // sys/class/net/eth0/operstate:沒有這樣的文件或目錄' –

+0

我只是將它們粘貼進來。 – Edouard

0

您的bash腳本正試圖在/sys/class/net的每個子目錄中調用cat文件operstate,並且未找到該文件。在第二個示例中,您只需輸入一個字符串,該字符串可以很好地打印出來。