谁能帮我理解这个 bash 脚本?
Can anyone help me understand this bash script?
我正在尝试对 SSD 固件进行一些分析,发现了一个名为 firmware.sh 的 bash 脚本,我觉得它很有趣。但是,我真的不知道我在看什么。
如果有人能帮助我理解这段代码的用途或作用,我将不胜感激!
这是bash:
#!/bin/sh -e
FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware"
err() {
echo "$@" >&2
if [ -x /usr/bin/logger ]; then
/usr/bin/logger -t "${0##*/}[$$]" "$@"
fi
}
if [ ! -e /sys$DEVPATH/loading ]; then
err "udev firmware loader misses sysfs directory"
exit 1
fi
for DIR in $FIRMWARE_DIRS; do
[ -e "$DIR/$FIRMWARE" ] || continue
echo 1 > /sys$DEVPATH/loading
cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
echo 0 > /sys$DEVPATH/loading
exit 0
done
echo -1 > /sys$DEVPATH/loading
err "Cannot find firmware file '$FIRMWARE'"
exit 1
我特别感兴趣的是 for 循环...我想我知道 $NAME 语法用于 bash 中的变量,但我不知道这些变量引用的是什么。感谢您的考虑!
我会试着逐行解释。
FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware"
FIRMWARE_DIRS
设置了由 space 分隔的两个目录。这是稍后在脚本中为 for
循环设置的。
...
for DIR in $FIRMWARE_DIRS; do
对于每个循环,DIR
被设置为存储在FIRMWARE_DIRS
中的每个目录
[ -e "$DIR/$FIRMWARE" ] || continue
[
表示测试开始,很像if
,]
表示测试结束。
-e
检查传递的参数是否为存在的文件或目录。
||
表示 or
如果左侧的测试失败,则右侧的任何内容都将执行。
continue
停止循环的当前迭代,从下一次迭代开始。
FIRMWARE
估计是之前设置的环境变量
脚本 运行。如果已在登录时设置,您可以看到它的值
通过在命令行上执行命令 echo $FIRMWARE
。
echo 1 > /sys$DEVPATH/loading
截断文件 /sys$DEVPATH/loading
(如果存在),然后将数字 1
输出到此文件。
cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
截断文件 /sys$DEVPATH/data
(如果存在),然后将文件 $DIR/$FIRMWARE
的内容输出到 /sys$DEVPATH/data
。如果FIRMWARE
包含通配符*
,则会复制所有匹配的文件的内容。
echo 0 > /sys$DEVPATH/loading
截断文件 sys$DEVPATH/loading
(如果存在),然后将数字 0
输出到此文件。
exit 0
以 return 状态 0 退出脚本(表示它完成正常)。对于通过上述测试的任何迭代(检查文件或目录是否存在),这会在此时结束 for
循环中的脚本。
总体而言,它似乎正在检查 FIRMWARE_DIRS
中存在的第一个目录,将一个或多个固件文件从那里复制到另一个位置
(/sys$DEVPATH/data
) 并在完成一次后立即退出。
我正在尝试对 SSD 固件进行一些分析,发现了一个名为 firmware.sh 的 bash 脚本,我觉得它很有趣。但是,我真的不知道我在看什么。
如果有人能帮助我理解这段代码的用途或作用,我将不胜感激!
这是bash:
#!/bin/sh -e
FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware"
err() {
echo "$@" >&2
if [ -x /usr/bin/logger ]; then
/usr/bin/logger -t "${0##*/}[$$]" "$@"
fi
}
if [ ! -e /sys$DEVPATH/loading ]; then
err "udev firmware loader misses sysfs directory"
exit 1
fi
for DIR in $FIRMWARE_DIRS; do
[ -e "$DIR/$FIRMWARE" ] || continue
echo 1 > /sys$DEVPATH/loading
cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
echo 0 > /sys$DEVPATH/loading
exit 0
done
echo -1 > /sys$DEVPATH/loading
err "Cannot find firmware file '$FIRMWARE'"
exit 1
我特别感兴趣的是 for 循环...我想我知道 $NAME 语法用于 bash 中的变量,但我不知道这些变量引用的是什么。感谢您的考虑!
我会试着逐行解释。
FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware"
FIRMWARE_DIRS
设置了由 space 分隔的两个目录。这是稍后在脚本中为 for
循环设置的。
...
for DIR in $FIRMWARE_DIRS; do
对于每个循环,DIR
被设置为存储在FIRMWARE_DIRS
[ -e "$DIR/$FIRMWARE" ] || continue
[
表示测试开始,很像if
,]
表示测试结束。-e
检查传递的参数是否为存在的文件或目录。||
表示or
如果左侧的测试失败,则右侧的任何内容都将执行。continue
停止循环的当前迭代,从下一次迭代开始。FIRMWARE
估计是之前设置的环境变量 脚本 运行。如果已在登录时设置,您可以看到它的值 通过在命令行上执行命令echo $FIRMWARE
。
echo 1 > /sys$DEVPATH/loading
截断文件 /sys$DEVPATH/loading
(如果存在),然后将数字 1
输出到此文件。
cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
截断文件 /sys$DEVPATH/data
(如果存在),然后将文件 $DIR/$FIRMWARE
的内容输出到 /sys$DEVPATH/data
。如果FIRMWARE
包含通配符*
,则会复制所有匹配的文件的内容。
echo 0 > /sys$DEVPATH/loading
截断文件 sys$DEVPATH/loading
(如果存在),然后将数字 0
输出到此文件。
exit 0
以 return 状态 0 退出脚本(表示它完成正常)。对于通过上述测试的任何迭代(检查文件或目录是否存在),这会在此时结束 for
循环中的脚本。
总体而言,它似乎正在检查 FIRMWARE_DIRS
中存在的第一个目录,将一个或多个固件文件从那里复制到另一个位置
(/sys$DEVPATH/data
) 并在完成一次后立即退出。