2010-11-17 186 views
3

我在发帖之前很快搜索到了这个,但是找不到任何类似的帖子。让我知道他们是否存在。命令从Shell脚本工作,但不是从命令行?


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

该目录包含了一堆命名文件的

命令行版本(这是执行时的bash运行) “epi1_mcf_0 ### nii.gz”:

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”功能来寻找?)

+2

您是否定义了任何shell别名?(类型'别名')这些会影响命令行输入的命令,但不会影响脚本。 – 2010-11-17 01:46:58

+0

解决了这个问题......'ls'被定义为'ls --color'。我很好奇 - 为什么这会有所作为?当使用颜色版本时,ls的原始输出是不同的? (谢谢!) – 2010-11-17 01:55:32

+0

使用转义码生成颜色,这是由终端程序解释的额外字符序列,但您通常不想传递给其他程序。 – 2010-11-17 01:59:26

回答

2

(我第一次提到这个的评论,但我会做出一个答案,因为它帮助!)

你有任何的shell别名定义? (类型alias)这些会影响命令行键入的命令,但不会影响脚本。

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

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

7

`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` ``标记上ch咽。

+0

谢谢!我不知道这个... – 2010-11-17 02:08:06

+0

不只是一个挑剔的,非常肯定更好 - 不能使用变量ls输出(颜色,说)如果你不使用它的问题! – Cascabel 2010-11-17 02:10:42

+2

@Jefromi - 与IFS分裂相比,颜色实际上是一个小问题;带有空格,非打印字符或换行符的文件名是编程使用ls的许多其他问题之一。 – 2010-11-17 03:15:22