bash - 在 bash 脚本中调试 tar 时遇到问题
问题描述
我正在尝试调试我的 bash 脚本的 tar 部分。当我在文件名周围使用引号时,tar 只是看不到文件。
我试图将 tar 行回显到文件中,它可以工作。但是在运行脚本时找不到文件
#!/bin/bash
i=0
code=0
paths=""
fatal_check() {
if [[ $? != 0 ]]; then
exit 2
elif [[ $1 != "-z" && $1 != "-h" && $1 != "" ]]; then
echo $1
echo "unknown options"
exit 2
elif [[ $2 != "-z" && $2 != "-h" && $2 != "" ]]; then
echo $2
echo "unknown options"
exit 2
fi
}
fatal_check $1 $2
if [[ $1 == "-h" || $2 == "-h" ]]; then
echo ""
echo "bash script to infer file types and gather more information about them"
echo ""
echo "OPTIONS"
echo -e "-h \t shows this help"
echo -e "-z \t zips all regular files"
exit 0
fi
while read stdin; do
if [[ $stdin == "PATH "* ]]; then
path=${stdin:5}
if [[ -L "$path" ]]; then
echo LINK "'$path'" "'$(readlink "$path")'"; fatal_check
elif [[ -d "$path" ]]; then
echo DIR "'$path'"
elif [[ -f "$path" ]]; then
wc=$(wc -l < "$path"); fatal_check
ln=$(head -n 1 "$path"); fatal_check
echo FILE "'$path'" $wc "'$ln'"
if [[ $1 == "-z" || $2 == "-z" ]]; then
paths="${paths}'${path}' "
fi
else
>&2 echo ERROR "'$path'"
code=1
fi
fi
done
if [[ $paths != "" ]]; then
tar czf output.tgz $paths; fatal_check
fi
exit $code
这就是 tar 扔给我的。再一次,当我实际上将同一行回显到文件并将其作为命令运行时,它运行正常。
tar: './test': Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
解决方案
考虑到包含空格的文件名,使用单引号将每个文件名括起来是一种合理的处理方式。
问题是当将变量“$paths”tar
作为参数传递时,单引号被逐字解释为文件名的一部分。请试试:
echo "$paths" | xargs tar czf output.tgz; fatal_check
代替:
tar czf output.tgz $paths; fatal_check
请注意,我们需要假设原始文件名不包含单引号。
希望这可以帮助。
推荐阅读
- netsuite - NetSuite 如何从技术角度核对银行对账单?
- python - 如何保存机器人框架中嵌入参数的先前实例?
- google-sheets - Google Sheets 对具有相同第一个单元格值的行求和,按第一行值分组
- r - 绘制堆积条形图 add_trace 循环问题
- azure - Azure DevOps 和 Azure Active Directory
- sql-server - 如何将运行在 Docker 容器中的 Flyway 连接到运行在 Docker 容器中的数据库?
- automation - 使用 RDP 进行社区版执行的 Uipath 自动化
- angular - Angular Material Elevate 不在 2 个组件之间显示
- jquery - Jquery Datatable根据值更改行颜色
- airflow - 有没有办法将失败的 Airflow 任务的错误文本传递给另一个任务?