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
может быть символической ссылкой или жесткой ссылкой. Если это символическая ссылка, способ portable для ее устранения:
% 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
. Его функции делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие области, как локальные переменные и массивы. Обычный sh
- очень минималистический язык программирования.
Но реальный вопрос в том, является ли модифицируемый Dtype при обновлении?
blockquote>Нет, вы не можете: source .
Из вашего примера ваш чистый код Java будет выглядеть следующим образом:
Parent parent = new Parent(); //object received from request, stored in database as it is if (some conditions is met) { // FirstChild firstChild = (Parent) parent; //this would throw ClassCastException FirstChild firstChild = new FirstChild(parent); //creating new object, gc will collect parent }
Таким образом, hibernate действует так же, как и Java: вы не можете обновить
Parent
, вы должны создать новую запись дляfirstChild
и удалитьparent
.Не поможет ли вам использовать
@DiscriminatorFormula
вместо проверкиsome condition is met
при обработке запроса?@DiscriminatorFormula("case when value = 'some value' then 'FirstChild' else 'SecondChild' end")
Тогда вам не придется сохранять
Parent
, а затем обрабатывать его записи.
Это мои выводы:
Child
следует расширять Parent
. С точки зрения моделирования, я бы вместо этого назвал один абстрактный класс FamilyMember
, а затем Parent
, FirstBorn
и [115 ] будет исходить от члена семьи.