2013-11-25 4 views
0

У меня есть Ubuntu машина с оболочкой по умолчанию установлена ​​в Баш и оба пути к исполняемому файлу в $ PATH:Почему bash ведет себя по-другому, когда его называют sh?

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

Но когда я пытаюсь вызвать скрипт, который использует the inline file descriptor (что только баш может справиться, но не ш) оба вызова ведут себя по-разному:

$ . ./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")' 

пример-сценарий, я имею в виду, что выглядит как

#!/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[*]} 
+0

Было бы полезно увидеть фактический скрипт - в частности, ведущую строку с помощью shebang (#!/...). Во-вторых, какая оболочка вы используете в настоящий момент с подсказкой «$»? – Daniel

+0

SRY, я думал, что будет ясно. Он работает в оболочке по умолчанию (согласно моему первому предложению) bash. Выгрузите скрипт тоже. – fragmentedreality

+2

http://www.gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode –

ответ

3

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

+0

Да, стандарты ссылок всегда были очень веским аргументом, чтобы уничтожить что-то, что лучше, чем эти стандарты. Особенно для стандартов, которые были «изобретены» комитетом. – peterh

+1

@MaXX Я не уверен, что понимаю вашу точку зрения. – chepner

+0

Пожалуйста, попробуйте объяснить, чего недостаточно. – peterh

-2

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

+2

ОП, очевидно, сбросил '/ bin/sh 'снова указывать на' bash'. – chepner

0

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

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

Это теория.

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

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

+1

Боюсь, что вам не хватает основной цели стандартов в целом и Unix/POSIX в частности. В этом случае ** позволить ** разработчикам создавать сценарии, которые переносятся между совместимыми платформами. Нет скрытой повестки дня. – jlliagre

+0

Жаль, что вы не ошиблись, но я уже так много. Особенно удаление сети из bash, и gzipped debs сделали мое мнение таким, каким оно есть в настоящее время. – peterh

+0

Оба текущих и предыдущих выпуска Debian поддерживают сетевую поддержку в bash, и эта функция не отключается, когда bash запускается в режиме POSIX. Я не вижу, как gzipped debs, что бы это ни значило, относятся к поведению bash/sh или стандартам POSIX. – jlliagre

Смежные вопросы