如何强制命令在bash脚本中执行

时间:2018-08-26 18:56:23

标签: bash shell

我想在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

感谢您的帮助和耐心。

2 个答案:

答案 0 :(得分:4)

您的脚本不应多次处理文件,并且除非重新运行,否则它不会在同一执行中获得tar x的结果。但是,那里有一些问题:

  • 它将处理任何文件,而不仅仅是tar.gz文件
  • 如果脚本重新运行,它将提取先前提取的结果,并且还将重新处理所有先前扩展的tar.gz文件
  • 如果任何文件中包含空格,则会失败(请参见ParsingLs
  • 没有错误检查以查看提取是否成功

因此,可以采用更好的方式来解决上述问题:

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