Постоянная конфигурация grub2 при установке Debian 8 (Jessie) на Asus X205TA

Я был бы удивлен, если бы это была настоящая оболочка Борна в Linux.Хотя оболочка Bourne теперь перенесена на Linux, обычно она не устанавливается и даже не упаковывается по умолчанию.

Вы бы установили его только для археологических целей.

Возможно, вы путаете sh (который в настоящее время относится к интерпретатору или другому языку POSIX sh ) с оболочкой Bourne (древняя оболочка, которую также называли sh (и от которого происходят современные sh s, но также отличаются)).

Оболочка Борна не имеет псевдонимов. Современные ш до.

Псевдонимы, однако, являются локальными для текущей оболочки. Если вы запустите новую оболочку (будь то bash , sh , csh , zsh ...), эта новая оболочка не будет наследуют эти псевдонимы.

Вам нужно будет переопределить эти псевдонимы в новой оболочке.

bash имеет способ сбросить определение одного из его псевдонимов в синтаксисе, совместимом с синтаксисом sh . Итак, вы могли бы сделать:

alias foo='echo foo' # alias defined in bash
foo_definition=$(alias foo)
sh -c "$foo_definition
foo"

Или просто:

sh -c "$(alias foo)
foo"

Теперь есть загвоздка в том, что он не работает во всех реализациях sh . Сначала вы заметили, что мы не сделали:

sh -c "$(alias foo);foo"

Что сработало бы в реализации без sh .

Это потому, что псевдонимы действительно похожи на некоторую форму расширения макросов. Поскольку раскрытие псевдонима выполняется до синтаксического анализа, в alias foo = 'echo foo'; foo , к моменту выполнения команды alias строка уже была проанализирована.

Размещение определения псевдонима в одной строке и его использование в следующей работает для некоторых оболочек, но некоторые другие (например, yash или zsh ) анализируют все sh -c код в целом, поэтому расширение псевдонима там не работает.

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

Вы можете получить значение псевдонима, выполнив:

eval "$(alias foo | sed '1s/ /_/')"

Что сохранит определение псевдонима foo в переменной $ alias_foo .

Затем вы можете:

sh -c "$alias_foo"

Передать значение псевдонима foo в качестве кода оболочки в sh .

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

foo() { echo foo; }
export -f foo
sh -c foo

Работает только в системах, где sh реализован с bash (в основном только Apple OS / X и некоторые системы на базе Linux).

Более переносимый подход был бы подобен тому, что псевдонимы сбрасывают определение функции в код, переданный в sh -c :

sh -c "$(typeset -f foo); foo"

На этот раз нет проблем с временем расширения, time -of-parsing как функции в отличие от псевдонимов, поскольку функции являются реальными структурами языка.

Однако необходимо убедиться, что определение функции содержит код, который соответствует синтаксису sh и не использует какое-либо расширение bash .

1
24.06.2018, 10:22
0 ответов

Теги

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