我想在bash脚本的ng serve
循环中使用命令替换,如下所示:
for
问题在于提取每个文件后,在下一次迭代中,ls将再次执行,因此 for file in `ls`; do
echo "$file"
tar xzvf "$file"
done
循环遍历新集合。我决定在开始循环之前捕获for
的输出,并在循环中使用它:
ls
但是,似乎没有运行 files=`ls`
for file in ${files}; do
echo "$file"
tar xzvf "$file"
done
并将结果存储在ls
中,shell只是将$files
替换为${files}
,而我和我在同一时间在第一个代码示例中。
如何强制外壳程序在代码的ls
部分运行ls
命令?
更新
我正在使用Ubuntu 16.04笔记本电脑
files=ls
和$ uname -a
Linux laptop 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
我家中有一个名为GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
的文件夹,其中包含两个简单的压缩文件以及我的脚本:
test
test
├── a.tar.gz
├── b.tar.gz
└── script.sh
内容:
script.sh
这是#!/usr/bin/env bash
files=`ls`
for file in ${files}; do
echo "$file"
tar xzvf "$file"
done
文件夹内部的bash -x script.sh
的输出:
test
最后++ ls
+ files='a.tar.gz
b.tar.gz
script.sh'
+ for file in '${files}'
+ echo a.tar.gz
a.tar.gz
+ tar xzvf a.tar.gz
a
+ for file in '${files}'
+ echo b.tar.gz
b.tar.gz
+ tar xzvf b.tar.gz
b
+ for file in '${files}'
+ echo script.sh
script.sh
+ tar xzvf script.sh
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
(在手动删除提取的文件之后)输出:
bash script.sh
感谢您的帮助和耐心。
答案 0 :(得分:4)
您的脚本不应多次处理文件,并且除非重新运行,否则它不会在同一执行中获得tar x
的结果。但是,那里有一些问题:
因此,可以采用更好的方式来解决上述问题:
for zipfile in *.tar.gz; do
printf '%s\n' "Processing file '$zipfile'"
tar xzvf "$zipfile" && mv "$zipfile" "$zipfile.done"
if (($? == 0)); then
printf '%s\n' "$zipfile: success"
else
printf '%s\n' "$zipfile: failure"
fi
done
答案 1 :(得分:0)
似乎我对VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV Unable to stop the stream: Device or resource busy
VIDEOIO ERROR: V4L : cant open camera by index 0
命令输出感到困惑,因为在tar
中有一个名为a.tar.gz
的文件,对于a
也是如此。
按如下所示更改代码即可解决问题:
b.tar.gz