2015-11-28 2 views
4

Я пишу сценарий оболочки Korn, где у меня есть функция, как этотКак выполнить несколько команду после двойных труб в сценарии оболочки

#!/bin/ksh 
myfunc() { 
    some_command1 || return 1 
    some_command2 || return 1 
    ... 
} 

В словах, я поставил двойные трубы с последующим обратным утверждением, так что функция немедленно возвращается, когда команда терпит неудачу.

Но я также хочу, чтобы он печатает некоторые сообщения об ошибках, прежде чем вернуться, я попытался

#!/bin/ksh 
myfunc() { 
    some_command1 || echo "error while doing some_command1"; return 1 
    some_command2 || echo "error while doing some_command2"; return 1 
    ... 
} 

Но это не работает, первый оператор возврата всегда получают казнены независимо от того, some_command1 удалось или не удалось.

И

#!/bin/ksh 
myfunc() { 
    some_command1 || (echo "error while doing some_command1"; return 1) 
    some_command2 || (echo "error while doing some_command2"; return 1) 
    ... 
} 

также не работает, то кажется, что это только вернется из суб-процессов не функции и some_command2 не получить выполнен независимо от того, some_command1 удалось или не удалось.

Есть ли способ сгруппировать операторы echo "error while doing some_command2"; return 1 так, чтобы они оба выполнялись вместе только тогда, когда предыдущая команда терпит неудачу.

+2

'{cmd1; cmd2; } 'может быть? –

+0

Мне нравится стиль этой функции - сначала удалите исключения из пути, и избегайте вложенных ifs. –

ответ

7

Простым способом является использование { ...; ...; }, это объединяет команды без создания подоболочки.

some_command1 || 
    { echo "error while doing some_command1"; return 1; } 

Я рекомендую использовать стандартный поток ошибок для сообщений об ошибках, хотя:

some_command1 || 
    { echo "error while doing some_command1" >& 2; return 1; } 

И только потому, что я могу, я дам вам мой секретный ярлык:

some_command1 || 
    return 1 $(echo "error while doing some_command1" >& 2) 

, что в прошлом бит - нетрадиционная, но все же переносная оболочка POSIX.

+1

Как-то решение # 1 и # 2 не работает для меня, оно действует, как никакие фигурные скобки не существуют и всегда выполняет 'return 1'. Но # 3 работает как шарм. – asinkxcoswt

+1

Извините, я просто понял, почему решение №1 и №2 не работает для меня, потому что я пишу это так: '{echo" 444 "; return 1} 'где нет точки с запятой после' return 1'. Это делает оператор return выполняться каждый раз, когда – asinkxcoswt

+4

@asinkxcoswt, '' и '' '** должны ** иметь пробелы вокруг них. См. Https://www.gnu.org/software/bash/manual/bashref.html#Command-Grouping –

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