【问题标题】:Commands work from Shell script but not from command line?命令从 Shell 脚本工作,但不能从命令行工作?
【发布时间】:2011-05-11 04:33:31
【问题描述】:

我在发帖前快速搜索了这个,但找不到任何类似的帖子。让我知道它们是否存在。


正在执行的命令看起来很简单。目录列表用作函数的输入。

该目录包含一堆名为“epi1_mcf_0###.nii.gz”的文件

命令行版本(执行时bash正在运行):

fslmerge -t output_file `ls epi1_mcf_0*.nii.gz`

Shell 脚本版本:

#!/bin/bash
fslmerge -t output_file `ls epi1_mcf_0*.nii.gz`

命令行版本失败,但 shell 脚本一个完美运行。

错误消息是特定于函数的,但无论如何都包含在内。

** ERROR (nifti_image_read): failed to find header file for 'epi1_mcf_0000.nii.gz'
** ERROR: nifti_image_open(epi1_mcf_0000.nii.gz): bad header info
Error: failed to open file epi1_mcf_0000.nii.gz
Cannot open volume epi1_mcf_0000.nii.gz for reading!

我对这个问题感到非常沮丧(在我发现有一种方法可以让命令工作之后,我就不那么沮丧了)。

任何帮助将不胜感激。

(还是普遍认为问题应该在“fslmerge”函数中寻找?)

【问题讨论】:

  • 您是否定义了任何 shell 别名? (输入alias)这些会影响在命令行输入的命令,但不会影响脚本。
  • 解决了这个问题...'ls'被定义为'ls --color'。我很好奇 - 为什么这会有所作为?使用彩色版本时,ls的原始输出是否不同? (谢谢!)
  • 颜色是用转义码生成的,由终端程序解释的额外字符序列,但您通常不想传递给其他程序。
  • 别名应该是ls --color=auto,以便ls在不输出到tty时可以禁用颜色。
  • 请阅读mywiki.wooledge.org/ParsingLs; ls 永远不应该以这种方式使用。

标签: linux bash scripting command-line shell


【解决方案1】:

`ls epi1_mcf_0*.nii.gz` 最好写成epi1_mcf_0*.nii.gz。如:

fslmerge -t output_file epi1_mcf_0*.nii.gz

`ls` 没有添加任何内容。

注意:作为答案而不是评论发布。 Markdown-lite 注释解析器被我的 `` `ls epi1_mcf_0*.nii.gz` `` 标记阻塞。

【讨论】:

  • 不只是挑剔,绝对更好 - 如果你不使用它,变量 ls 输出(比如说颜色)不会有问题!
  • @Jefromi - 与 IFS 上的拆分相比,颜色实际上是一个小问题;带有空格、不可打印字符或换行符的文件名是 ls 编程使用的许多其他问题之一。
  • @Charles:当然。我刚刚提到了颜色,因为这是这个问题的问题。
【解决方案2】:

(我首先在评论中提到了这一点,但我会做出回答,因为它有帮助!)

您是否定义了任何 shell 别名? (输入alias)这些会影响在命令行输入的命令,但不会影响脚本。

Linux 通常将ls 定义为ls --color。这可能会影响输出,因为颜色代码是作为转义码通过常规输出流发送的。如果您使用ls --color=auto,它将自动检测其输出是否为终端。来自man ls

默认情况下,不使用颜色来区分文件类型。那是 相当于使用--color=none。使用 --color 选项而不使用 可选的 WHEN 参数等效于使用 --color=always。和 --color=auto,仅当标准输出连接到终端(tty)时才会输出颜色代码。

【讨论】: