Як називається команда (функція), яка працює після відмови команди?


-1

Якщо запустити команду, якщо цієї команди немає, то відображається деяка інформація щодо відмови команди.

Я намагаюся взяти інформацію про цю невдалу команду як вхід до мого сценарію, який повинен запускатися автоматично, коли команда не працює.

Кожен раз, коли команда провалюється, $?значення буде 127. Я маю зловити цю невдалу подію і запустити там свої команди.


2
Для запуску , scriptякщо commandне вдається, використовуйте: command || script.
John1024

Ми повинні заглянути в кришталеву кулю і подивитися, який ваш сценарій? Ми не сервіс написання сценарію. Будь ласка редагувати і додати сценарій до цього питання. Якщо у вас немає сценарію, спробуйте написати його, і тоді ми допоможемо вам його виправити.
DavidPostill


1
(1) Це не листування. Якщо ми допомогли вам досягти певного прогресу у вирішенні вашої проблеми, не роздувайте своє запитання і не переписуйте його як подальший досвід. Ви можете обмежено доповнити своє запитання, уточнивши його (а не замінюючи його). Я зробив перший крок, роблячи це для вас. … (Продовження)
G-Man

2
(Продовження)… (2) На жаль, ви не наблизилися до чіткого пояснення. Мабуть, ніхто до мене не розумів першої версії вашого питання. (Я припускаю, що ви намагаєтеся працювати з command_not_found_handleцим, я принаймні наблизився до його тлумачення правильно.) Поки що ніхто не розуміє, що ви зараз говорите. У вашому запитанні я залишив місця, підкреслюючи інформацію, якої немає. Якщо ви можете заповнити їх, ви можете отримати додаткову допомогу. Будь ласка, не відповідайте на коментарі; відредагуйте своє запитання, щоб зробити його більш зрозумілим та повним.
G-Man

Відповіді:


3

У мене є цей фрагмент у моєму /etc/bash.bashrc(Ubuntu 14.04.4 LTS):

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
    function command_not_found_handle {
            # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
           /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ];     then
           /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
        else
           printf "%s: command not found\n" "$1" >&2
           return 127
        fi
    }
fi

Схоже, вам слід перезаписати command_not_found_handleфункцію. Я не знаю, чи command-not-foundпотрібен пакет для цього; Я думаю, що ні, але я можу помилятися.

Приклад:

function command_not_found_handle { echo BOOM! ; }

Результат:

$ foo12345
BOOM!
$ echo "echo is valid command"
echo is valid command
$ agrgokdnlkdgnoajgldfnsdalf grhofhadljh
BOOM!
$ cat /etc/issue
Ubuntu 14.04.4 LTS \n \l

$ catt /etc/issue
BOOM!

Для відновлення (швидкого та брудного):

# Assuming you haven't modified /etc/bash.bashrc
. /etc/bash.bashrc
# Quick and dirty, because if your ~/.bashrc or ~/.bash_profile //
# overwrites some settings from /etc/bash.bashrc //
# you need to source them again.
# Things may get complicated, I won't cover all the ifs here.
# Logout and login again for the clean start.

Змініть, /etc/bash.bashrcщоб змінити поведінку "команда не знайдена" для всіх користувачів. Визначте свій власний command_not_found_handleін , ~/.bashrcщоб змусити його працювати тільки для вас. Або запишіть два файли з правильними визначеннями функцій, щоб увімкнути та вимкнути хак будь-коли. Важливо: не виконуйте файли, надсилайте їх так:

. ~/.hack_enable
. ~/.hack_disable

Там, де .hack_enableвизначається ваша функція, .hack_disableповертається до початкового (від першого кодового блоку моєї відповіді або до чогось подібного, що є правильним у вашому випадку).


Велике спасибі за хорошу пояснювальну відповідь: Якщо мені це подобається, він працює, але мої псевдоніми також розглядаються як команда не знайдених речей. Як можна ставитися до них по-різному?
Анканна

За винятком псевдонімів, він чудово працює. Чи можете ви допомогти мені пропустити псевдоніми? Я відредагував питання, оскільки питання, здається, було дещо заплутаним раніше. Дякую за швидку відповідь
Ankanna

-1

Спробуйте наступний сценарій:

if command ; then
    echo "Command succeeded"
 else
    echo "Command failed"
fi

У цьому випадку ви можете виконувати будь-який код, який хочете у кожному випадку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.