加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

为什么Linux命令CP在CLI和脚本中的行为有所不同?

发布时间:2020-12-14 01:23:57 所属栏目:Linux 来源:网络整理
导读:我想复制一堆Verilog / systemverilog源代码,所以我使用CP和通配符表达式: cp some_dir/*.{v,sv,svh} . 有用.但是当我将它放到具有完全相同行的脚本时,CP命令会失败并显示日志: cp: cannot stat `../../mytest/spiTest/*.{v,svh}': No such file or direct
我想复制一堆Verilog / systemverilog源代码,所以我使用CP和通配符表达式:

cp <some_dir>/*.{v,sv,svh} .

有用.但是当我将它放到具有完全相同行的脚本时,CP命令会失败并显示日志:

cp: cannot stat `../../mytest/spiTest/*.{v,svh}': No such file or directory

这是怎么回事?

PS:我使用bash作为shell.

这是我的脚本:

#!/bin/bash
rdir=../../mytest/spiTest
f1="$rdir/bench.lst"
f2="$rdir/cphex" #the script to copy rom data
f3="$rdir/make*" #makefile scripts
f4="$rdir/*.hex" #rom files
f5="$rdir/*.{v,svh}" #testbench files
echo 'Copying files...'
cp $f1 $f2 $f3 $f4 .
cp $f5 .

我把第一行更改为

#!/bin/bash -vx

并再次运行此脚本,我得到:

#!/bin/bash -vx

rdir=../../mytest/spiTest
+ rdir=../../mytest/spiTest
f1="$rdir/bench.lst"
+ f1=../../mytest/spiTest/bench.lst
f2="$rdir/cphex" #the script to copy rom data
+ f2=../../mytest/spiTest/cphex
f3="$rdir/make*" #makefile scripts
+ f3='../../mytest/spiTest/make*'
f4="$rdir/*.hex" #rom files
+ f4='../../mytest/spiTest/*.hex'
f5="$rdir/*.{v,svh}" #testbench files
+ f5='../../mytest/spiTest/*.{v,svh}'

echo 'Copying files...'
+ echo 'Copying files...'
Copying files...
cp $f1 $f2 $f3 $f4 .
+ cp ../../mytest/spiTest/bench.lst ../../mytest/spiTest/cphex ../../mytest/spiTest/makefile ../../mytest/spiTest/makefile.defines ../../mytest/spiTest/rom.hex ../../mytest/spiTest/rom_if.hex .
cp $f5 .
+ cp '../../mytest/spiTest/*.{v,svh}' .
cp: cannot stat `../../mytest/spiTest/*.{v,svh}': No such file or directory

解决方法

检查脚本的第一行.它可能是:

#!/bin/sh

它将shell从BASH切换到Bourne Shell.使用

#!/bin/bash

代替.

[编辑]你遇到了扩展问题. BASH有一定的顺序,可以扩展模式和变量.这意味着:

f5="$rdir/*.{v,svh}" #testbench files

引用,因此此时不会发生文件名扩展.仅展开变量$rdir.什么时候

cp $f5 .

执行后,BASH首先查找要扩展的文件名,但没有.然后它扩展变量(f5)然后用两个参数调用cp:../../ mytest / spiTest / *.{v,svh}和..因为cp要求shell已经执行了文件名扩展,你得到一个错误.

要解决此问题,您必须使用数组:

f5=($rdir/*.{v,svh})

这将替换变量,然后展开文件名并将所有内容放入数组f5中.然后,您可以使用此数组调用cp,同时保留空格:

cp "${f5[@]}" .

这里的每一个角色都很重要. [@]告诉BASH在这里扩展整个数组.引述说:保留空白. {}必须告诉BASH [@]是要扩展的变量“name”的一部分.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读