Может ли GRUB загрузить Windows напрямую?

Примечание: zsh будет жаловаться на «плохие шаблоны», если вы не настроите его для приема «встроенных комментариев» для большинства приведенных здесь примеров и не запускаете их через оболочку прокси, как я сделал с sh .

Итак, как я сказал в комментариях выше, я не знаю конкретно о bash set -E , но я знаю, что совместимые с POSIX оболочки предоставляют простые средства тестирования значение, если хотите:

    sh -evx <<-\CMD
    _test() { echo $( ${empty:?error string} ) &&\
        echo "echo still works" 
    }
    _test && echo "_test doesnt fail"
    # END
    CMD
sh: line 1: empty: error string
+ echo

+ echo 'echo still works'
echo still works
+ echo '_test doesnt fail'
_test doesnt fail

Выше вы увидите, что хотя я использовал расширение параметра для проверки $ {empty?} _test () все еще return s проход - как показано в последнем echo Это происходит потому, что неудачное значение уничтожает подоболочку $ (подстановка команд) , которая его содержит, но его родительская оболочка - _test в это время - продолжает грузовую перевозку. А echo все равно - он вполне доволен обслуживанием только \ newline; echo - это , а не тест.

Но примите во внимание следующее:

    sh -evx <<-\CMD
    _test() { echo $( ${empty:?error string} ) &&\
            echo "echo still works" ; } 2<<-INIT
            ${empty?function doesnt run}
    INIT
    _test ||\
            echo "this doesnt even print"
    # END
    CMD
_test+ sh: line 1: empty: function doesnt run

Поскольку я передал _test () вход предварительно оцененным параметром в INIT здесь-документе , теперь _test ( ) функция даже не пытается запускаться. Более того, оболочка sh очевидно полностью избавляется от призрака, а echo «это даже не печатает» даже не печатает.

Возможно, это не то, что вы хотите.

Это происходит потому, что расширение параметра стиля $ {var?} предназначено для выхода из оболочки в случае отсутствия параметра, оно работает примерно так :

$ {параметр:? [word]}

Показывать ошибку, если Null или Не задано. Если параметр не установлен или равен нулю, расширение слова (или сообщение, указывающее, что оно не установлено, если слово пропущено) должно быть записано в стандартную ошибку и оболочка завершает работу с ненулевым статусом выхода . В противном случае значение параметра должно быть заменено на . Интерактивная оболочка не требует выхода.

Я не буду копировать / вставлять весь документ, но если вам нужен сбой для набора , но с нулевым значением , используйте форму:

$ {var :? сообщение об ошибке}

С : двоеточие , как указано выше. Если вы хотите, чтобы значение null было успешным, просто опустите двоеточие. Вы также можете отрицать это и терпеть неудачу только для установленных значений, как я покажу через мгновение.

Другой запуск _test ():

    sh <<-\CMD
    _test() { echo $( ${empty:?error string} ) &&\
            echo "echo still works" ; } 2<<-INIT
            ${empty?function doesnt run}
    INIT
    echo "this runs" |\
        ( _test ; echo "this doesnt" ) ||\
            echo "now it prints"
    # END
    CMD
this runs
sh: line 1: empty: function doesnt run
now it prints

Это работает со всеми видами быстрых тестов, но выше вы увидите, что _test () , запускается с середины ] pipeline терпит неудачу, и на самом деле содержащая подоболочка списка команд полностью выходит из строя, так как ни одна из команд внутри функции не выполняется, ни следующее echo не выполняется вообще, хотя это также показано, что это легко проверить, потому что теперь выводится echo «теперь он печатает» .

Полагаю, дьявол кроется в деталях.В приведенном выше случае завершается оболочка , а не скрипта _main | логика | конвейер , но (подоболочка, в которой мы $ {test?}) || , поэтому требуется небольшая песочница.

И это может быть неочевидно, но если вы хотите передать только противоположный случай или только set = значений, это тоже довольно просто:

    sh <<-\CMD
    N= #N is NULL
    _test=$N #_test is also NULL and
    v="something you would rather do without"    
    ( #this subshell dies
        echo "v is ${v+set}: and its value is ${v:+not NULL}"
        echo "So this ${_test:-"\$_test:="} will equal ${_test:="$v"}"
        ${_test:+${N:?so you test for it with a little nesting}}
        echo "sure wish we could do some other things"
    )
    ( #this subshell does some other things 
        unset v #to ensure it is definitely unset
        echo "But here v is ${v-unset}: ${v:+you certainly wont see this}"
        echo "So this ${_test:-"\$_test:="} will equal NULL ${_test:="$v"}"
        ${_test:+${N:?is never substituted}}
        echo "so now we can do some other things" 
    )
    #and even though we set _test and unset v in the subshell
    echo "_test is still ${_test:-"NULL"} and ${v:+"v is still $v"}"
    # END
    CMD
v is set: and its value is not NULL
So this $_test:= will equal something you would rather do without
sh: line 7: N: so you test for it with a little nesting
But here v is unset:
So this $_test:= will equal NULL
so now we can do some other things
_test is still NULL and v is still something you would rather do without

В приведенном выше примере используются все преимущества 4 формы подстановки параметров POSIX и их различные : тест на нулевое двоеточие или ненулевое значение . Дополнительная информация приведена по ссылке выше, и здесь снова .

И я думаю, мы должны показать работу нашей функции _test , верно? Мы просто объявляем empty = something в качестве параметра нашей функции (или в любое время заранее):

    sh <<-\CMD
    _test() { echo $( echo ${empty:?error string} ) &&\
            echo "echo still works" ; } 2<<-INIT
            ${empty?tested as a pass before function runs}
    INIT
    echo "this runs" >&2 |\
        ( empty=not_empty _test ; echo "yay! I print now!" ) ||\
            echo "suspiciously quiet"
    # END
    CMD
this runs
not_empty
echo still works
yay! I print now!

Следует отметить, что эта оценка является самостоятельной - она ​​не требует дополнительных тестов для отказа. Еще пара примеров:

    sh <<-\CMD
    empty= 
    ${empty?null, no colon, no failure}
    unset empty
    echo "${empty?this is stderr} this is not"
    # END
    CMD
sh: line 3: empty: this is stderr

    sh <<-\CMD
    _input_fn() { set -- "$@" #redundant
            echo ${*?WHERES MY DATA?}
            #echo is not necessary though
            shift #sure hope we have more than $1 parameter
            : ${*?WHERES MY DATA?} #: do nothing, gracefully
    }
    _input_fn heres some stuff
    _input_fn one #here
    # shell dies - third try doesnt run
    _input_fn you there?
    # END
    CMD
heres some stuff
one
sh: line :5 *: WHERES MY DATA?

И, наконец, мы возвращаемся к исходному вопросу: как обрабатывать ошибки в подоболочке $ (подстановка команд) ? Правда в том, что есть двумя способами, но ни один из них не является прямым. Суть проблемы заключается в процессе оценки оболочки - расширения оболочки (включая $ (подстановка команд) ) происходят раньше в процессе оценки оболочки, чем выполнение текущей команды оболочки - именно тогда ваши ошибки могут быть обнаружены и в ловушке.

Проблема, с которой сталкивается оператор, заключается в том, что к тому времени, когда текущая оболочка оценивает ошибки, подоболочка $ (подстановка команд) уже заменена - ошибок не остается.

Итак, каковы два пути? Либо вы делаете это явно в подоболочке $ (подстановка команд) с тестами, как и без нее, либо вы переносите ее результаты в текущую переменную оболочки и проверяете ее значение.

Метод 1:

    echo "$(madeup && echo \: || echo '${fail:?die}')" |\
          . /dev/stdin

sh: command not found: madeup
/dev/stdin:1: fail: die

    echo $?

126

Метод 2:

    var="$(madeup)" ; echo "${var:?die} still not stderr"

sh: command not found: madeup
sh: var: die

    echo $?

1

Этот завершится ошибкой независимо от количества переменных, объявленных в строке:

   v1="$(madeup)" v2="$(ls)" ; echo "${v1:?}" "${v2:?}"

sh: command not found: madeup
sh: v1: parameter not set

И наше возвращаемое значение остается постоянным:

    echo $?
1

ТЕПЕРЬ ЛОВУШКА:

    trap 'printf %s\\n trap resurrects shell!' ERR
    v1="$(madeup)" v2="$(printf %s\\n shown after trap)"
    echo "${v1:?#1 - still stderr}" "${v2:?invisible}"

sh: command not found: madeup
sh: v1: #1 - still stderr
trap
resurrects
shell!
shown
after
trap

    echo $?
0

0
10.04.2019, 14:21
2 ответа

Esc(i. е.^[)не является клавишей типа Shift -, такой как Shift , Ctrl , Alt или Meta . Эти последние клавиши изменяют код символа, отправленный другой клавишей , отправленной при нажатии в комбинации с . Например, символ, отправленный с помощью ] (]), отличается от символа, отправленного с помощью Ctrl + ] (^]), который, в свою очередь, отличается от символа, отправленного с помощью . Сдвиг + ](}). Escсам является символом и не может комбинироваться с другим символом; просто отправил в последовательности (, т.е. до или после )с ними.

0
28.01.2020, 03:51

Если в репозиториях вашего дистрибутива есть xbindkeys, вы можете легко комбинировать его с xdotool.

0
28.01.2020, 03:51

Теги

Похожие вопросы