Нам стало полезно получить немного более простой и точный ответ на вопрос «когда мы последний раз залапили эту вещь?». Поэтому я поставил это вместе. Я тестировал его 12.04 и 14.04 и 16.04. Он возвращает достаточно точные ответы на этот вопрос. Примечание: «разумно точный», вероятно, не является «полностью точным». Примечание: «только для этого вопроса».
образец вывода:
xenial% 9: ./linuxpatchdate
2016-07-19 54
2017-02-24 363
2017-03-08 7
2017-03-09 2
подпрограммы и программа:
#!/usr/bin/perl
#------------------ subroutines --------------------
sub parseRecord {
my $sdate = "";
my $useful = 0;
my $packages = 0;
my @ptmp;
while (my $recordLine = shift() ) {
if ($recordLine =~ m/^Start-Date: ([\d\-]*).*/) {
$sdate = $1;
}
elsif ($recordLine =~ m/^Commandline:.*upgrade/) {
$useful = 1;
}
elsif ($recordLine =~ m/^Install: (.*)/) {
$recordLine =~ s/\([^\)]*\)//g;
@ptmp = split(/,/,$recordLine);
$packages = $packages + $#ptmp + 1;
}
elsif ($recordLine =~ m/^Upgrade: (.*)/) {
$recordLine =~ s/\([^\)]*\)//g;
@ptmp = split(/,/,$recordLine);
$packages = $packages + $#ptmp + 1;
}
}
if ($useful) {
return ($sdate,$packages);
}
else {
return ("0",0);
}
}
#------------------ main program --------------------
@lines = split(/\n/,`/bin/zcat -f /var/log/apt/history.log /var/log/apt/history*gz`);
my %patchHash;
my $line;
my @inputLines;
my $pushDate = "";
my $pushNum = "";
foreach $line (@lines) {
# all records separated by blank lines
if ($line !~ /./) {
# no-op
}
elsif ($line =~ m/^Start-Date: ([\d\-]*).*/) {
@inputLines = ();
push (@inputLines, $line);
}
elsif ($line =~ m/^End-Date: ([\d\-]*).*/) {
($pushDate, $pushNum) = parseRecord(@inputLines);
if ($pushNum != 0) {
$patchHash{$pushDate} += $pushNum;
}
}
else {
push (@inputLines, $line);
}
}
foreach $pushDate (sort(keys(%patchHash))) {
print "$pushDate $patchHash{$pushDate}\n";
}
На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Это показывает способ удаления произвольных чисел нулей.
Если действительно существует разница между поведением в командной строке и сценарием, то, скорее всего, сценарий использует другой интерпретатор (разные версии bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt). Последнее различие может быть результатом вашего интерактивного поиска оболочки $HOME/.bashrc и $HOME/.profile, тогда как сценариев, как правило, нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но это должно влиять на параметры оболочки, которые необходимо установить в каждой оболочке.
Ваш вопрос нельзя ответить в целом. Хотя некоторые комментарии. По моей версии баш (3.1.17(1)-релиз), ваша команда не имеет желаемого результата даже при запуске из командной строки; то же с ЗШ. Так что, видимо, что-то подозрительное в вашу команду. Я не знаю, что "##+(0)" будет готов выполнить, но "#0" не удастся вытащить один ведущий ноль. Это показывают способ, чтобы удалить произвольное количество нулей.
если там действительно есть разница между поведением в командной строке и из скрипта, то, скорее всего, скрипт использует другой переводчик (различные версии оболочки bash, баш вместо ЗШ) или другую оболочку варианты (попробуйте запустить shopt). Последнее различие может быть результатом интерактивной оболочке источников [F2] и $HOME/.profile, тогда как сценарии, как правило, не. Это не должно влиять на переменные окружения, так как они по наследству, если на экспорт, но это должно повлиять на параметры оболочки, которые должны быть установлены в каждом патроне.
На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Это показывает способ удаления произвольных чисел нулей.
Если действительно существует разница между поведением в командной строке и сценарием, то, скорее всего, сценарий использует другой интерпретатор (разные версии bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt). Последнее различие может быть результатом вашего интерактивного поиска оболочки $HOME/.bashrc и $HOME/.profile, тогда как сценариев, как правило, нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но это должно влиять на параметры оболочки, которые необходимо установить в каждой оболочке.
На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Это показывает способ удаления произвольных чисел нулей.
Если действительно существует разница между поведением в командной строке и сценарием, то, скорее всего, сценарий использует другой интерпретатор (разные версии bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt). Последнее различие может быть результатом вашего интерактивного поиска оболочки $HOME/.bashrc и $HOME/.profile, тогда как сценариев, как правило, нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но это должно влиять на параметры оболочки, которые необходимо установить в каждой оболочке.
Ваш вопрос нельзя ответить в целом. Хотя некоторые комментарии. По моей версии баш (3.1.17(1)-релиз), ваша команда не имеет желаемого результата даже при запуске из командной строки; то же с ЗШ. Так что, видимо, что-то подозрительное в вашу команду. Я не знаю, что "##+(0)" будет готов выполнить, но "#0" не удастся вытащить один ведущий ноль. Это показывают способ, чтобы удалить произвольное количество нулей.
если там действительно есть разница между поведением в командной строке и из скрипта, то, скорее всего, скрипт использует другой переводчик (различные версии оболочки bash, баш вместо ЗШ) или другую оболочку варианты (попробуйте запустить shopt). Последнее различие может быть результатом интерактивной оболочке источников [F2] и $HOME/.profile, тогда как сценарии, как правило, не. Это не должно влиять на переменные окружения, так как они по наследству, если на экспорт, но это должно повлиять на параметры оболочки, которые должны быть установлены в каждом патроне.
На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.
Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt
). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc
и $ HOME / .profile
, тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.
На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.
Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt
). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc
и $ HOME / .profile
, тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.
На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.
Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt
). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc
и $ HOME / .profile
, тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.
На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.
Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt
). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc
и $ HOME / .profile
, тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.
На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.
Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt
). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc
и $ HOME / .profile
, тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.
shopt
... Все остальное похоже на одно и то же, и есть различия в настройках shopt i>, поэтому я попытался повторно найти веб-страницу, где я впервые столкнулся с этой командой ... На самом деле было намного легче найти это время:) ... Он упоминает, что extglob
должен быть на
... my на
для CLI, но выключен
для скриптов! .... Когда я предшествую команде с shopt -s extglob i>, команды работают отлично! ... так спасибо за это! .... (Я не знаю, как сделать эту постоянную настройку, но я должен уметь ее выработать (надеюсь :)
– Peter.O
10 January 2011 в 16:58
extglob
... its: var = «000123000»; echo & quot; $ [10 # $ var] & quot;
Он использует преобразование числовой базы, поэтому он работает только для '0 .. другой метод - это string i> -based
– Peter.O
10 January 2011 в 17:39
$ [...]
. Это устаревший синтаксис для математики в bash, и в какой-то момент он исчезнет. Вместо этого используйте $ ((...))
.
– geirha
22 January 2011 в 21:49
Предполагая, что вы используете одну и ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~/.bashrc читается интерактивными оболочками, но не с помощью интерпретаторов сценариев. Причина в том, что сценарии обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.
Многие вещи в типичных файлах .bashrc применяются только к командной строке (подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; обычно вы помещаете их в отдельный файл и отправляете его как из ~/.bashrc, так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории (!! и т. д.) включено по умолчанию только в интерактивных оболочках.
Здесь вы используете конструкцию +(…), которая является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob. Очевидно, вы имеете это в своем ~/.bashrc.
Вы можете поместить shopt -s extglob в свой скрипт или использовать переносимый способ усечения ведущего 0 s из переменной, такой как
var=${var#${var%%[!0]*}}
Предполагая, что вы используете одну и ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~/.bashrc читается интерактивными оболочками, но не с помощью интерпретаторов сценариев. Причина в том, что сценарии обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.
Многие вещи в типичных файлах .bashrc применяются только к командной строке (подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; обычно вы помещаете их в отдельный файл и отправляете его как из ~/.bashrc, так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории (!! и т. д.) включено по умолчанию только в интерактивных оболочках.
Здесь вы используете конструкцию +(…), которая является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob. Очевидно, вы имеете это в своем ~/.bashrc.
Вы можете поместить shopt -s extglob в свой скрипт или использовать переносимый способ усечения ведущего 0 s из переменной, такой как
var=${var#${var%%[!0]*}}
предполагаю, что вы используете тот же Шелл в скрипте и в вашем терминале, основное различие заключается в том, что ~/.bashrc читается интерактивную оболочку, а не скрипт-перевод снарядов. Причина в том, что скрипты обычно предназначены, чтобы быть переносимой, и за то, что Вы не хотите зависеть от настроек пользователя.
многие вещи в типичном .bashrc файлы применяются только к командной строке равно (настройки подсказки, горячие клавиши). Некоторые, такие как определения функций, смысла в сценарии, а также, как правило, вы бы поместить их в отдельный файл и источник его от [F4], а скрипты. Иногда вы хотите, чтобы некоторые варианты оболочка для интерактивного использования, но не в сценарии, потому что они приводят к более коротким (хорош в командной строке), но более загадочным или менее портативный (плохо в скриптах) код. Есть несколько вещей, которые громят, - совсем по-другому, например, расширение история (!!, и т. д.). по умолчанию включена только в интерактивную оболочку.
здесь вы используете +(…) конструкт, который представляет собой КШ расширенные подстановка шаблона. Bash не включить их по умолчанию (для обратной совместимости), но вы можете включить их с shopt -s extglob. Видимо у вас это в вашей ~/.bashrc.
Вы можете положить [F9] в ваш скрипт, или использовать портативный способ усечения ведущих [F10]для S от переменных, таких как
var=${var#${var%%[!0]*}}
предполагаю, что вы используете тот же Шелл в скрипте и в вашем терминале, основное различие заключается в том, что ~/.bashrc читается интерактивную оболочку, а не скрипт-перевод снарядов. Причина в том, что скрипты обычно предназначены, чтобы быть переносимой, и за то, что Вы не хотите зависеть от настроек пользователя.
многие вещи в типичном .bashrc файлы применяются только к командной строке равно (настройки подсказки, горячие клавиши). Некоторые, такие как определения функций, смысла в сценарии, а также, как правило, вы бы поместить их в отдельный файл и источник его от [F4], а скрипты. Иногда вы хотите, чтобы некоторые варианты оболочка для интерактивного использования, но не в сценарии, потому что они приводят к более коротким (хорош в командной строке), но более загадочным или менее портативный (плохо в скриптах) код. Есть несколько вещей, которые громят, - совсем по-другому, например, расширение история (!!, и т. д.). по умолчанию включена только в интерактивную оболочку.
здесь вы используете +(…) конструкт, который представляет собой КШ расширенные подстановка шаблона. Bash не включить их по умолчанию (для обратной совместимости), но вы можете включить их с shopt -s extglob. Видимо у вас это в вашей ~/.bashrc.
Вы можете положить [F9] в ваш скрипт, или использовать портативный способ усечения ведущих [F10]для S от переменных, таких как
var=${var#${var%%[!0]*}}
предполагаю, что вы используете тот же Шелл в скрипте и в вашем терминале, основное различие заключается в том, что ~/.bashrc читается интерактивную оболочку, а не скрипт-перевод снарядов. Причина в том, что скрипты обычно предназначены, чтобы быть переносимой, и за то, что Вы не хотите зависеть от настроек пользователя.
многие вещи в типичном .bashrc файлы применяются только к командной строке равно (настройки подсказки, горячие клавиши). Некоторые, такие как определения функций, смысла в сценарии, а также, как правило, вы бы поместить их в отдельный файл и источник его от [F4], а скрипты. Иногда вы хотите, чтобы некоторые варианты оболочка для интерактивного использования, но не в сценарии, потому что они приводят к более коротким (хорош в командной строке), но более загадочным или менее портативный (плохо в скриптах) код. Есть несколько вещей, которые громят, - совсем по-другому, например, расширение история (!!, и т. д.). по умолчанию включена только в интерактивную оболочку.
здесь вы используете +(…) конструкт, который представляет собой КШ расширенные подстановка шаблона. Bash не включить их по умолчанию (для обратной совместимости), но вы можете включить их с shopt -s extglob. Видимо у вас это в вашей ~/.bashrc.
Вы можете положить [F9] в ваш скрипт, или использовать портативный способ усечения ведущих [F10]для S от переменных, таких как
var=${var#${var%%[!0]*}}
Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc
читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.
Многие вещи в типичных файлах .bashrc
все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc
, так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !!
и т. д.) включено по умолчанию только в интерактивных оболочках.
Здесь вы используете конструкцию + (...)
, который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob
. По-видимому, это у вас в ~ / .bashrc
.
Вы можете поместить shopt -s extglob
в свой скрипт или использовать переносимый способ усечения 0
s от переменной, такой как
var = $ {var # $ {var %% [! 0] *}}
Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc
читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.
Многие вещи в типичных файлах .bashrc
все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc
, так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !!
и т. д.) включено по умолчанию только в интерактивных оболочках.
Здесь вы используете конструкцию + (...)
, который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob
. По-видимому, это у вас в ~ / .bashrc
.
Вы можете поместить shopt -s extglob
в свой скрипт или использовать переносимый способ усечения 0
s от переменной, такой как
var = $ {var # $ {var %% [! 0] *}}
Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc
читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.
Многие вещи в типичных файлах .bashrc
все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc
, так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !!
и т. д.) включено по умолчанию только в интерактивных оболочках.
Здесь вы используете конструкцию + (...)
, который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob
. По-видимому, это у вас в ~ / .bashrc
.
Вы можете поместить shopt -s extglob
в свой скрипт или использовать переносимый способ усечения 0
s от переменной, такой как
var = $ {var # $ {var %% [! 0] *}}
Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc
читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.
Многие вещи в типичных файлах .bashrc
все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc
, так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !!
и т. д.) включено по умолчанию только в интерактивных оболочках.
Здесь вы используете конструкцию + (...)
, который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob
. По-видимому, это у вас в ~ / .bashrc
.
Вы можете поместить shopt -s extglob
в свой скрипт или использовать переносимый способ усечения 0
s от переменной, такой как
var = $ {var # $ {var %% [! 0] *}}
Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc
читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.
Многие вещи в типичных файлах .bashrc
все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc
, так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !!
и т. д.) включено по умолчанию только в интерактивных оболочках.
Здесь вы используете конструкцию + (...)
, который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob
. По-видимому, это у вас в ~ / .bashrc
.
Вы можете поместить shopt -s extglob
в свой скрипт или использовать переносимый способ усечения 0
s от переменной, такой как
var = $ {var # $ {var %% [! 0] *}}
.bashrc
пользователя по умолчанию (доступен для просмотра в качестве /etc/skel/.bashrc
) источников / usr / share / bash-completion / bash_completion
, в котором содержит shopt -s extglob progcomp .
– Eliah Kagan
9 January 2017 в 21:00