Mat*_*ner 2 linux bash shell ubuntu
使用以下简化代码提取:
DIR='a b'
mount_command="./mount.cpfs $loop $DIR -f $OPTS"
sudo $mount_command
Run Code Online (Sandbox Code Playgroud)
跟踪打开时执行此行:
+ sudo ./mount.cpfs /dev/loop0 a b -f -o default_permissions,allow_other,attr_timeout=0
Run Code Online (Sandbox Code Playgroud)
但是DIR没有引用,所以a并且b作为不同的参数传递,而不是相同的./mount.cpfs.
创建像这样的命令序列,然后将其扩展到更高版本的命令行的最佳方法是什么?
请记住,代码示例已简化为核心问题,我mount_command在几个地方使用前后各种添加DIR,并由用户传入.我DIR在分配时尝试了几种引用组合mount_command,并尝试使用数组.
mount_commandmount_command="./mount.cpfs $loop $DIR -f $OPTS"
case "$MODE" in
gdb)
sudo gdb -return-child-result -x gdbbatch \
--args $mount_command
;;
normal)
sudo $mount_command
;;
valgrind)
sudo valgrind --track-fds=yes --leak-check=full --malloc-fill=0x80 \
--free-fill=0xff $mount_command
;;
*)
echo "Mode '$MODE' unknown"
mounted=''
exit 2
;;
esac
Run Code Online (Sandbox Code Playgroud)
请测试你的建议,我不认为解决方案是直截了当的.
bash的最佳方法是使用数组.数组将保持单独分隔的单词,并在单个单词中保留空格:
DIR='a b'
mount_command=(./mount.cpfs $loop "$DIR" -f $OPTS)
sudo "${mount_command[@]}"
Run Code Online (Sandbox Code Playgroud)
当"${mount_command[@]}"膨胀时,各元件被扩展为一个参数sudo,即使其具有空间.
请注意我是如何引用"$DIR"但不是$OPTS,因为您$OPTS包含多个要作为单独的单词传递给mount命令但$DIR应该保持在一起的单词.但是,您可以使OPTS成为一个数组,mount_command并在mount_command定义中将其展开为"${OPTS[@]}":
DIR='a b'
OPTS=(-o default_permissions,allow_other,attr_timeout=0)
mount_command=(./mount.cpfs $loop "$DIR" -f "${OPTS[@]}")
sudo "${mount_command[@])"
Run Code Online (Sandbox Code Playgroud)
在bash脚本中完成了大量的命令构建后,我发现数组远远优于试图找出正确的引用(如果可能)以将命令保存在一个简单的字符串中.