Я бы не стал не пробуйте его на компакт-диске (хотя вполне может быть, что мои старые опасения по поводу буферизации устарели), но он отлично работает с USB-ключом; например:
curl -L http://cdimage.debian.org/debian-cd/8.6.0/amd64/iso-cd/debian-8.6.0-amd64-netinst.iso | sudo dd of=/dev/sdf
загружает текущий сетевой установщик Debian и записывает его в ключ sdf
.
Это работает, потому что dd
по умолчанию читает из своего стандартного ввода, если не указан параметр if
. Параметр -L
для curl
указывает ему следовать перенаправлениям.
На самом деле нет необходимости использовать dd
; как root
,
curl -L http://cdimage.debian.org/debian-cd/8.6.0/amd64/iso-cd/debian-8.6.0-amd64-netinst.iso > /dev/sdf
тоже работает нормально.
(Убедитесь, что вы правильно установили устройство! С помощью такой команды можно легко уничтожить не тот диск ...)
sh
(или язык команд оболочки )— это язык программирования, описанный POSIX. стандарт . Имеет множество реализаций (ksh88
, dash
,... ). bash
также может быть считается реализациейsh
(см. ниже ).
Поскольку sh
— это спецификация, а не реализация, /bin/sh
— символическая ссылка. (или жесткая ссылка )на фактическую реализацию в большинстве систем POSIX.
bash
начинался какsh
-совместимая реализация (, хотя она предшествовала стандарту POSIX на несколько лет ), но с течением времени она приобрела множество расширений. Многие из этих расширений могут изменить поведение допустимых сценариев оболочки POSIX, поэтому сам по себе bash
не является допустимой оболочкой POSIX. Скорее, это диалект языка оболочки POSIX.
bash
поддерживает переключатель --posix
, что делает его более совместимым с POSIX -. Он также пытается имитировать POSIX, если вызывается как sh
.
Долгое время /bin/sh
указывал на /bin/bash
в большинстве систем GNU/Linux. В результате стало почти безопасно игнорировать разницу между ними. Но это начало меняться в последнее время.
Некоторые популярные примеры систем, в которых /bin/sh
не указывает на/bin/bash
(и на некоторых из которых /bin/bash
может даже не существовать ), являются:
sh
на dash
; initramfs
. Он использует реализацию оболочки ash
. pdksh
, потомок оболочки Korn. FreeBSD sh
является потомком оригинальной оболочки UNIX Bourne. У Solaris есть собственный sh
, который долгое время не был совместим с POSIX -; бесплатная реализация доступна в проекте Heirloom .Как узнать, на что указывает /bin/sh
в вашей системе?
Сложность заключается в том, что /bin/sh
может быть символической ссылкой или жесткой ссылкой. Если это символическая ссылка, переносимый способ ее разрешения:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Если это жесткая ссылка, попробуйте
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
Фактически, флаг -L
распространяется как на символические, так и на жесткие ссылки. но недостаток этого метода в том, что он не переносимый — POSIX не требуетfind
для поддержки опции -samefile
, хотя и GNU find , и FreeBSD find поддерживают его.
В конце концов, вам решать, какой из них использовать, написав строку «shebang».
.
#!/bin/sh
будет использоватьsh
(и что бы это ни случилось, чтобы указать на ),
#!/bin/bash
будет использовать /bin/bash
, если он доступен (, и выдаст сообщение об ошибке, если он не ). Конечно, вы также можете указать другую реализацию, например.
#!/bin/dash
Для собственных сценариев я предпочитаю sh
по следующим причинам:
bash
, они должны иметьsh
Использование bash
также имеет свои преимущества. Его функции делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие вещи, как локальные переменные с областью действия и массивы. Plain sh
— очень минималистичный язык программирования.
В дополнение к отличному ответу @Hunter.S.Thompson я хотел бы отметить, что непереносимая часть скрипта -— это
pdf_file="${html_file/.html/.pdf}"
${variable/search/replace}
является расширением GNU. Но этого легко избежать с помощью чистого POSIX :
pdf_file="${html_file%.html}".pdf
Вслед за Хантером, это лучшее решение, чем изменение шебанга на#! /bin/bash