Linux下bash脚本执行cp命令报命名错误的问题求助
Bash脚本cp命令执行报错修复方案
cp命令核心错误点
原脚本问题代码行:
cp -r /home/share/informatyka_3/drop/drop-001.jpg /home/student/stud42/Kolokwium/Obraz | mv drop-001.jpg Obraz.jpg
具体错误如下:
- 管道符
|使用完全错误。管道符的作用是将前一个命令的标准输出作为后一个命令的标准输入,cp命令执行时不会输出文件名字符串作为输出内容,mv命令无法通过管道获取要操作的源文件参数;同时管道会让两个命令并行启动,mv执行时cp还未完成文件拷贝,会直接提示找不到drop-001.jpg文件。 - 冗余参数误用:
-r参数是递归拷贝目录时使用的参数,当前操作是拷贝单个jpg格式文件,不需要加该参数,虽然不会直接触发报错,但属于无效写法。 - 路径逻辑冗余:执行该行命令前已经通过
cd Obraz进入目标目录,不需要写完整绝对路径作为cp的目标位置,写绝对路径反而容易因为上下文切换出错。
cp命令修正写法
二选一即可,第一种更简洁:
- 直接在拷贝时完成重命名,不需要额外执行mv:
# 已进入Obraz目录的前提下执行 cp /home/share/informatyka_3/drop/drop-001.jpg ./Obraz.jpg
- 如果要保留拷贝后改名的逻辑,用
&&连接两个命令(表示前一条命令执行成功后才执行后一条),禁止用管道符:
cp /home/share/informatyka_3/drop/drop-001.jpg ./ && mv ./drop-001.jpg ./Obraz.jpg
脚本其他会导致执行失败的问题(附带修复)
- LaTeX代码直接裸写在bash脚本中,没有写入到提前创建的
Kolokwium.tex文件,执行脚本时会把LaTeX语法当成bash命令解析直接报错。需要在回到Kolokwium根目录后,用heredoc语法将LaTeX内容写入文件,同时补充缺失的依赖包、修正格式错误:
cat > Kolokwium.tex << 'EOF' \documentclass[11pt, a4paper, twoside]{article} \usepackage{amsfonts} \usepackage{graphicx} % 必须引入该包才能使用includegraphics插入图片 \begin{document} \author{Bartosz Obstawski} \title{Dokumentacja} \date{7.06.2022} \maketitle \newpage \begin{enumerate} \item{Kolokwium} \begin{enumerate} \item{Kolokwium.tex} \item{Baza danych} \begin{enumerate} \item{Dane.txt} \item{Dane.sql} \end{enumerate} \item{Obraz} \begin{enumerate} \item{Obraz.jpg} \end{enumerate} \item{Dokumenty} \begin{enumerate} \item{Bartosz} \item{Obstawski} \end{enumerate} \end{enumerate} \end{enumerate} \begin{figure}[h] \centering % 该命令需要放在插图命令前才能实现居中效果 \includegraphics[width=0.95\textwidth]{/home/student/stud42/Kolokwium/Obraz/Obraz.jpg} \caption{Obraz z kolokwium} \end{figure} \end{document} EOF
- 建议所有
cd命令后增加失败退出判断,例如cd Baza_danych || exit 1,避免上一级目录创建失败时,后续命令在错误路径下执行产生混乱。
内容的提问来源于stack exchange,提问作者Bartek Obstawski
相关产品推荐
相关产品推荐

