2013-04-17 1 views
0

В приведенном ниже коде я пытаюсь проверить, успешно ли выполнена команда в состоянии if и что данные были перенесены в целевой файл temp.txt.Что приводит к изменению статуса выхода для той же команды, даже когда вывод идентичен?

Рассмотрим:

#!/usr/bin/ksh 

A=4 
B=1 

$(tail -n $(($A - $B)) sample.txt > temp.txt) 
echo "1. Exit status:"$? 

if [[ $(tail -n $(($A - $B)) sample.txt > temp.txt) ]]; then 
    echo "2. Exit status:"$? 
    echo "Command completed successfully" 
else 
    echo "3. Exit status:"$? 
    echo "Command was unsuccessfully" 
fi 

Выход:

$ sh sample.sh 
1. Exit status:0 
3. Exit status:1 

Теперь я не могу получить, почему изменения состояния выхода выше .. когда выход как экземпляры хвоста команды идентичны. Где я здесь не так?

ответ

1

В первом случае вы получаете статус завершения вызова на tail команд (subshell вы порождал с $() сохраняет статус последнего выхода)

Во втором случае вы получаете статус выхода вызова на [[ ]] Bash. Но это фактически тестирование вывода вашей команды tail, что является совершенно другой операцией. И так как этот вывод пустой, тест не удался.

Рассмотрим:

$ [[ "" ]]   # Testing an empty string 
$ echo $?   # exit status 1, because empty strings are considered equivalent to FALSE 
1 
$ echo    # Empty output 

$ echo $?   # exit status 0, the echo command executed without errors 
0 
$ [[ $(echo) ]]  # Testing the output of the echo command 
$ echo $?   # exit status 1, just like the first example. 
1 
$ echo foo 
foo 
$ echo $?   # No errors here either 
0 
$ [[ $(echo foo) ]] 
$ echo $?   # Exit status 0, but this is **NOT** the exit status of the echo command. 
0 
+0

Привет Миклош, спасибо! Но почему он возвращает «1» (Ошибка?) Во втором случае, когда в выполнении команды нет ошибок?? –

+0

Придумал и обновил свой ответ соответственно. –