Подтвердить что ты не робот

Почему bash ведет себя по-другому, когда называется sh

У меня есть машина ubuntu с установленной оболочкой по умолчанию для bash и оба пути к двоичному в $PATH:

$ which bash
/bin/bash
$ which sh
/bin/sh
$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Mar  6  2013 /bin/sh -> bash*

Но когда я пытаюсь вызвать script, который использует встроенный файловый дескриптор (который может обрабатывать только bash, но не sh), оба вызова ведут себя по-другому

$ . ./inline-pipe
reached
$ bash ./inline-pipe
reached
$ sh ./inline-pipe
./inline-pipe: line 6: syntax error near unexpected token `<'
./inline-pipe: line 6: `done < <(echo "reached")'

Пример - script Я имею в виду, что это выглядит как

#!/bin/sh
while read line; do
if [[ "$line" == "reached" ]]; then echo "reached"; fi
done < <(echo "reached")

реальный бит немного длиннее:

#!/bin/sh
declare -A elements
while read line
do
    for ele in $(echo $line | grep -o "[a-z]*:[^ ]*")
    do
        id=$(echo $ele | cut -d ":" -f 1)
        elements["$id"]=$(echo $ele | cut -d ":" -f 2)
    done
done < <(adb devices -l)
echo ${elements[*]}
4b9b3361

Ответ 1

Когда bash вызывается как sh, он (в основном) ограничивается функциями, найденными в стандарте POSIX. Подстановка процесса не является одной из этих функций, поэтому ошибка.

Ответ 2

Теоретически это функция bash: если вы называете "sh", она по умолчанию отключает все ее функции. И корневая оболочка по умолчанию "/bin/sh".

Его основная цель - безопасность. Вторичный - это некоторый уровень совместимости некоторых оболочек системы, поскольку он позволяет сценариям системы работать в альтернативной (быстрее? Более безопасной?) Среде.

Это теория.

Практически это так, что в команде разработчиков всегда есть люди, которые хотят сводить и устранять все с помощью различных аргументов (безопасность, простота, безопасность, стабильность), но эти аргументы как-то всегда идут в направлении удаления, удаление, уничтожение).

Это связано с тем, что bash в debian не имеет сетевых сокетов, потому что debian не смог через 20 лет нормально интегрировать лучшие компрессоры (bz2, xz) - и это потому, что корневая оболочка по умолчанию такой примитивный, как PDP11 80-х годов.

Ответ 3

Я считаю, что sh на ubuntu на самом деле dash, который меньше bash с меньшим количеством функций.