![隱藏檔案? (很可能是個錯誤的腳本)](https://rvso.com/image/122419/%E9%9A%B1%E8%97%8F%E6%AA%94%E6%A1%88%EF%BC%9F%20%EF%BC%88%E5%BE%88%E5%8F%AF%E8%83%BD%E6%98%AF%E5%80%8B%E9%8C%AF%E8%AA%A4%E7%9A%84%E8%85%B3%E6%9C%AC%EF%BC%89.png)
我正在編寫一個由 Udev 執行的腳本,用於在 Debian Jessie 下的我的 Beaglebone Black 上插入新的 SD 卡。
我希望我的腳本做的第一件事是建立/media/sdcard
目錄。這應該很容易,但由於某種不明原因它不起作用...
這是我寫的腳本:
#!/bin/bash -xe
#This script creates the /media/sdcard folder in order to mount the sdcard in it
#Error codes:
# - 2 : /media/sdcard already exist but is not a directory
# - 1 : Failed to create /media/sdcard/
logger -t SDCardscripts 'Entering /root/ServolineScripts/PrepareSDCard.sh script'
if [ -d /media/sdcard ]; then
logger '/media/sdcard is already present. Deleting it.' && rm -rf /media/sdcard;
elif [ -f /media/sdcard ]; then
logger -t SDCardscripts 'A file /media/sdcard already exist! Stopping process, Please look in the /media directory and take a decision with it content'
exit 2
else
logger -t SDCardscripts '/media/sdcard does not exist creating a new one'
fi
mkdir -p /media/sdcard
if [ $? -eq 0 ];then
logger -t SDCardscripts '/media/sdcard directory successfully created';
else
logger -t SDCardscripts 'Failed to create /media/sdcard directory'
exit 1;
fi
logger -t SDCardscripts 'Leaving /root/ServolineScripts/PrepareSDCard.sh script'
以下是我插入 SD 卡時產生的日誌行:
Nov 24 14:06:34 undefined kernel: [ 5546.379851] mmc0: host does not support reading read-only switch, assuming write-enable
Nov 24 14:06:34 undefined kernel: [ 5546.383558] mmc0: new high speed SDHC card at address 0007
Nov 24 14:06:34 undefined kernel: [ 5546.401181] mmcblk0: mmc0:0007 SD08G 7.42 GiB
Nov 24 14:06:34 undefined rsyslogd-2007: action 'action 17' suspended, next retry is Fri Nov 24 14:07:04 2017 [try http://www.rsyslog.com/e/2007 ]
Nov 24 14:06:34 undefined kernel: [ 5546.413258] mmcblk0: p1
Nov 24 14:06:34 undefined SDCardscripts: Entering /root/ServolineScripts/PrepareSDCard.sh script
Nov 24 14:06:35 undefined logger: /media/sdcard is already present. Deleting it.
Nov 24 14:06:35 undefined systemd-udevd[2003]: Process '/root/ServolineScripts/PrepareSDCard.sh' failed with exit code 1.
Nov 24 14:06:35 undefined systemd-udevd[2003]: Process '/bin/mount /dev/%K /media/sdcard' failed with exit code 32.
所以我的理解是:
- Udev 在我的腳本中輸入 OK
- Udev 成功檢查檔案是否存在
- Udev 執行 mkdir 失敗
執行此腳本後,我嘗試:
root@undefined:~/ServolineScripts# cd /media
root@undefined:/media# ls -l
total 0
沒有意見...
最後,我嘗試刪除行來檢查 /media/sdcard 是否已存在(所有第一個 if 和 elif),在這種情況下,進程在 mkdir 執行時失敗。
當我插入 µSdcard 時會出現這種症狀,但是如果我透過鍵入 來執行腳本bash -xe /root/ServolineScripts/PrepareSDCard
,則會得到以下結果:
+ logger -t SDCardscripts 'Entering /root/ServolineScripts/PrepareSDCard.sh script'
+ '[' -d /media/sdcard ']'
+ logger '/media/sdcard is already present. Deleting it.'
+ rm -rf /media/sdcard
+ mkdir -p /media/sdcard
+ '[' 0 -eq 0 ']'
+ logger -t SDCardscripts '/media/sdcard directory successfully created'
+ logger -t SDCardscripts 'Leaving /root/ServolineScripts/PrepareSDCard.sh script'
(顯然它成功執行了 mkdir 並且 /media/sdcard/ 已創建......)
* 如果您對問題出在哪裡有任何想法...或任何可以幫助我調試這個問題的想法...*
(我已經用了 4 天了……我甚至嘗試用新圖像恢復 Beagle……:-( )
PS:我已經看到我寫的不同的返回不是一個好的命令......如果你知道如何在返回值時打破腳本,我會接受!但這是第二個主題......
答案1
由於您已啟用,您的腳本一旦收到錯誤就會退出bash -e
。
失敗的命令是rm -rf
,因為在您的腳本運行時安裝了一個檔案系統/media/sdcard
。
例子
# Prepare disk as image
dd if=/dev/zero bs=1M count=100 >100M.img
lo=$(losetup --find --show 100M.img | tee /dev/stderr)
fdisk $lo <<X
n
p
1
w
X
losetup -d $lo
lo=$(losetup --find --show --partscan 100M.img | tee /dev/stderr)
# Create and mount new filesystem
mkfs -t ext4 ${lo}p1
mkdir -p /mnt/dsk
mount ${lo}p1 /mnt/dsk
# Demonstrate trying to remove the directory tree (and failing)
rm -rf /mnt/dsk
echo SS=$?
# All done
umount /mnt/dsk
losetup -d $lo
rm 100M.img