gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:57:07 26 4
gpt4 key购买 nike

我想复制一堆Verilog/systemverilog的源码,所以我用CP加上通配符表达式:

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

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

cp: cannot stat `../../mytest/spiTest/*.{v,sv,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,sv,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,sv,svh}" #testbench files
+ f5='../../mytest/spiTest/*.{v,sv,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,sv,svh}' .
cp: cannot stat `../../mytest/spiTest/*.{v,sv,svh}': No such file or directory

最佳答案

检查脚本的第一行。它可能是这样写的:

#!/bin/sh

将 shell 从 BASH 切换到 Bourne Shell。使用

#!/bin/bash

相反。

[编辑] 您遇到了扩展问题。 BASH 有一定的顺序来扩展模式和变量。这意味着:

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

被引用,所以此时没有文件名扩展发生。只有变量 $rdir 被展开。当

cp $f5 .

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

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

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

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

cp "${f5[@]}" .

这里的每一个字符都很重要。 [@] 告诉 BASH 在此处展开​​整个数组。引号说:保留空白。 {} 是告知 BASH [@] 是要扩展的变量“name”的一部分所必需的。

关于linux - 为什么 Linux 命令 CP 在 CLI 和脚本中的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29671473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com