Що таке / бін / тире?


27

Я думав, що /bin/shце символьне посилання на мій вибір оболонки. Я завжди користувався bash, тому припускав, що /bin/shце вказуватиме /bin/bash. Це виявляється, що це вказує /bin/dash.

Стає смішніше. Я запускаю dashі роблю, echo $SHELLі він друкує /bin/bash(значить, вони в основному однакові?). Однак сторінка "man" dashповністю відрізняється від сторінки man bash(тому вони не однакові?).


1
@wzzrd, Це питання стосується Linux?
aioobe

1
зітхаю, я не можу підтримати всі ці приємні відповіді, оскільки мені потрібно 15 повторів. Я відчуваю неповносправність, оскільки у мене є 18 к. На стаквервер: - /
aioobe

4
ммм тире .. про що / bin / краш (для вболівальників gdb), / bin / slash (програма жорсткої економії), / bin / dash (важкі часи в Кореї), / bin / sash (для вболівальників), / bin / thrash (важко на вашому жорсткому диску), / бін / флеш (але лише якщо ви шифруєте свої дані), / бін / сховище (удача знайдеш пізніше), / бін / готівка (ти завжди в грошах), / bin / pash (романсуючи ПК), / bin / gash (aaargggh!).
ПП.

2
@PP - Я б читав / бін / треш для шанувальників музики Metal, та / bin / slash для шанувальників гітаристи рок-групи 80-х років ... :-P
gWaldo

1
Причина echo $SHELLдруку /bin/bashполягає в тому, що ця змінна встановлена ​​для оболонки за замовчуванням, яка починається під час входу, а не для поточної оболонки, яку ви працюєте. Почніть ksh або zsh з підказки Bash і echo $SHELLвсе одно буде говорити /bin/bash. Використовуйте, psщоб побачити, що зараз працює.
Призупинено до подальшого повідомлення.

Відповіді:


43

Debian і Ubuntu перейшли на тире (iirc) через пару речей. Перш за все, Баш з часом став великим. Насправді /bin/bashбінарний файл моєї системи Ubuntu 8.04 майже вдесятеро (!) Більший за /bin/dash. Тепер це не має великого значення для щоденного використання оболонки, але це має значення в наступних ситуаціях:

  • Тире набагато менше і, отже, завантажується швидше, що є користю для init-скриптів. Якщо вам доведеться почати багато з них, завантаження Dash замість Bash кожного разу значно прискорює роботу.
  • Через менший розмір Dash, Debian і Ubuntu здатні відголити досить великий шматок розміру свого initrd, залишаючи більше місця для інших матеріалів (і знову ж таки, прискорюючи речі).

Мінус використання Dash замість Bash для сценаріїв полягає в тому, що багато людей використовують синтаксичні приємності, які має лише Bash, так звані Bashisms . Прикладами башизмів є підрядки, такі як:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

І це:

echo ${a#123}
4567890

Dash, з іншого боку, головним чином має на меті бути сумісним з POSIX (і не більше того), приведе до помилки помилки підрозділу, якщо ви спробуєте це:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

Це буде мати значення, якщо ви використовуєте /bin/sh(і, отже, dashяк інтерпретатор своїх оболонок) та використовуєте в них башизми. У Debian та Ubuntu є гарні вікі-сторінки про башизми та про те, чому вони погані в оболонках взагалі та в init-скриптах зокрема. Тому ви повинні свідомо обирати, чи вам це потрібно, /bin/shчи /bin/bashяк інтерпретатор вашого сценарію.

Dash не повинен використовуватися як оболонка за замовчуванням у ваших системах. Просто використовуйте Bash для цього. Для портативності своїх сценаріїв ви можете використовувати Dash як інтерпретатор, щоб збільшити шанси, що сценарії працюватимуть на інших Linux та Unixes.


1
Якщо ви пишете сценарії з Bashisms, будь ласка, вкажіть /bin/bash; у багатьох нелінусовських системах є фактичні shоболонки, навіть не сумісні з ними bash.
Кріс S

echo ${a#123}не є башизмом, це частина специфікації розширення параметра POSIX. pubs.opengroup.org/onlinepubs/009695399/utilities/… Ви просто не отримаєте більш просунуті стилі sed Bash, а posix - стиль підрядки + прості символи розширення. Значить, POSIX також дозволяєecho ${a#*6}
JM Becker



0

Оскільки не всі оболонки встановлені $SHELLпід час запуску, ви дізнаєтесь про свою поточну оболонку за допомогою:

echo $0

Якщо вона дає помилку, це csh, інакше це те, на що argv[0]ви викликали, що, як правило, оболонка, можливо, із провідним -дефісом, щоб вказати, що це оболонка для входу.

Це не гарантується , оскільки argv[0]знаходиться під контролем процесу виклику, але на практиці це найнадійніший підхід.

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