2010-11-17 2 views
3

Я быстро искал это перед публикацией, но не нашел похожих сообщений. Дайте мне знать, если они существуют.Команды работают из сценария Shell, но не из командной строки?


Выполняемые команды кажутся очень простыми. Список каталогов используется как вход для функции.

Каталог содержит кучу файлов с именем

командной строки версии (Баш работает, когда это выполняется) "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` 

Ошибка командной строки, но сценарий оболочки работает отлично.

Сообщение об ошибке специфично для функции, но оно включено в любом случае.

** 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

Есть ли у вас какие-либо псевдонимы оболочки?(Введите «псевдоним»). Это повлияет на команды, введенные в командной строке, но не на скрипты. –

+0

Это решило проблему ... 'ls' был определен как 'ls -color'. Мне любопытно - почему это имеет значение? является ли исходный вывод ls другим при использовании цветовой версии? (Спасибо!) –

+0

Цвета генерируются с помощью эвакуационных кодов, дополнительных последовательностей символов, которые интерпретируются терминальной программой, но которые вы обычно не хотите передавать другим программам. –

ответ

2

(я говорил об этом в комментарии первый, но я сделаю ответ, так как это помогло!)

Есть ли у вас какие-либо псевдонимы оболочки определены? (Тип 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` ``.

+0

Спасибо! Я тоже не знал об этом ... –

+0

Не просто nitpick, очень определенно лучше - не может быть проблем с переменным выводом ls (цвет, скажем), если вы его не используете! – Cascabel

+2

@Jefromi - цвет на самом деле является второстепенной проблемой по сравнению с расщеплением на IFS; имена файлов с пробелами, непечатаемые символы или символы новой строки являются одними из многих других проблем с программным использованием ls. –

Смежные вопросы