
Я совсем новичок в Unix, и сейчас мне нужно создать псевдоним, который проверяет файл на регулярность и читаемость. Если файл нерегулярный, то мне нужно вернуть 1 в качестве кода выхода и не проверять, читаем ли он. Если он нечитаем, то мне нужно вернуть 2 в качестве кода выхода.
alias test="if [ ! -f filename ] ; then echo 'Irregular file'; exit 1 ; fi; if [ ! -r filename ]; then echo 'Unreadable file'; exit 2; fi;
Проблема в том, что теперь, когда я его запускаю, выход закрывает весь мой клиент. Есть ли способ обойти это?
решение1
Так как это первая ссылка при поиске в Google:
Если вы заключите выход в скобки
(exit 2)
то он установит код возврата, выйдя из подоболочки в скобках, и не выйдет из вашей текущей оболочки. Затем вы можете проверить этот код, используя $? как обычно
alias mytest="if [ ! -f filename ] ; then echo 'Irregular file'; (exit 1) ; elif [ ! -r filename ]; then echo 'Unreadable file'; (exit 2); fi"
решение2
Функция оболочки должна иметь возможность возвращать return
желаемое вами значение:
checktype() {
if [ ! -f "$1" ] ; then
echo 'Irregular file'
return 1
fi
if [ ! -r "$1" ]; then
echo 'Unreadable file'
return 2
fi
return 0
}
$ checktype /dev/stdin ; echo $?
Irregular file
1
Кроме того, test
это ужасное имя для псевдонима или функции, поскольку это стандартная (встроенная) утилита.
Я понимаю, что псевдоним — ужасный выбор, но сейчас его требует профессор.
Ладно, это немного меняет дело. Я бы предложил показать профу более подходящее решение и объяснить, почему простое не работает.
Но если это не сработает, и вы действительнодолжениспользуйте псевдоним, учтите, что возвращаемое значение на самом деле является просто возвращаемым значением последней выполненной команды. Вы должны быть в состоянии настроить что-то, что возвращает нужное вам значение...
(Если это домашнее задание, я не думаю, что будет справедливо давать полное решение сразу. Ниже спойлеры.)
Подсказка: вы уже использовали команду, которая возвращает произвольное значение.
решение3
alias
здесь плохой выбор. Поместите эти строки в файл скрипта bash.
#!/bin/bash
if [ ! -f filename ];
then echo 'Irregular file'; exit 1 ;
fi;
if [ ! -r filename ];
then echo 'Unreadable file'; exit 2;
fi;
Он будет работать так, как задумано.