Как отличаются среды стандартной командной строки терминала и сценария bash?

Нам стало полезно получить немного более простой и точный ответ на вопрос «когда мы последний раз залапили эту вещь?». Поэтому я поставил это вместе. Я тестировал его 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";
}
6
задан 11 January 2011 в 13:31

20 ответов

На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Это показывает способ удаления произвольных чисел нулей.

Если действительно существует разница между поведением в командной строке и сценарием, то, скорее всего, сценарий использует другой интерпретатор (разные версии bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt). Последнее различие может быть результатом вашего интерактивного поиска оболочки $HOME/.bashrc и $HOME/.profile, тогда как сценариев, как правило, нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но это должно влиять на параметры оболочки, которые необходимо установить в каждой оболочке.

2
ответ дан 25 May 2018 в 23:33
  • 1
    loevborg. Я добавил комментарий ниже моего вопроса об использовании ## + (0) ... и о моей текущей версии bash. – Peter.O 10 January 2011 в 14:21
  • 2
    Я добавил больше системных спецификаций в суть вопроса – Peter.O 10 January 2011 в 15:19
  • 3
    loevborg, вы были правы на своей цели со ссылкой на shopt ... Все остальное похоже на то же самое, и есть различия в настройках shopt , поэтому я попытался найти веб-сайт где я впервые столкнулся с этой командой ... На самом деле было намного легче найти это время:) ... Он упоминает, что extglob должен быть on ... мой on для CLI, но off для скриптов! .... Когда я предшествую команде с shopt -s extglob , команды работают отлично! ... так спасибо за это! .... (Я не знаю, как сделать эту постоянную настройку, но я должен уметь ее выработать (надеюсь :) – Peter.O 10 January 2011 в 16:58
  • 4
    PS. Я только что нашел аккуратный и простой способ удалить ведущие «0», которые не требуют extglob ... его: var="000123000"; echo "$[10#$var]" Он использует преобразование числовой базы, поэтому он работает только для «0» .. другой метод строка основанное – Peter.O 10 January 2011 в 17:39
  • 5
    Не используйте $[...]. Это устаревший синтаксис для математики в bash, и в какой-то момент он исчезнет. Вместо этого используйте $((...)). – geirha 22 January 2011 в 21:49

Ваш вопрос нельзя ответить в целом. Хотя некоторые комментарии. По моей версии баш (3.1.17(1)-релиз), ваша команда не имеет желаемого результата даже при запуске из командной строки; то же с ЗШ. Так что, видимо, что-то подозрительное в вашу команду. Я не знаю, что "##+(0)" будет готов выполнить, но "#0" не удастся вытащить один ведущий ноль. Это показывают способ, чтобы удалить произвольное количество нулей.

если там действительно есть разница между поведением в командной строке и из скрипта, то, скорее всего, скрипт использует другой переводчик (различные версии оболочки bash, баш вместо ЗШ) или другую оболочку варианты (попробуйте запустить shopt). Последнее различие может быть результатом интерактивной оболочке источников [F2] и $HOME/.profile, тогда как сценарии, как правило, не. Это не должно влиять на переменные окружения, так как они по наследству, если на экспорт, но это должно повлиять на параметры оболочки, которые должны быть установлены в каждом патроне.

2
ответ дан 25 July 2018 в 22:38

На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Это показывает способ удаления произвольных чисел нулей.

Если действительно существует разница между поведением в командной строке и сценарием, то, скорее всего, сценарий использует другой интерпретатор (разные версии bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt). Последнее различие может быть результатом вашего интерактивного поиска оболочки $HOME/.bashrc и $HOME/.profile, тогда как сценариев, как правило, нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но это должно влиять на параметры оболочки, которые необходимо установить в каждой оболочке.

2
ответ дан 26 July 2018 в 23:16

На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Это показывает способ удаления произвольных чисел нулей.

Если действительно существует разница между поведением в командной строке и сценарием, то, скорее всего, сценарий использует другой интерпретатор (разные версии bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt). Последнее различие может быть результатом вашего интерактивного поиска оболочки $HOME/.bashrc и $HOME/.profile, тогда как сценариев, как правило, нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но это должно влиять на параметры оболочки, которые необходимо установить в каждой оболочке.

2
ответ дан 31 July 2018 в 11:20

Ваш вопрос нельзя ответить в целом. Хотя некоторые комментарии. По моей версии баш (3.1.17(1)-релиз), ваша команда не имеет желаемого результата даже при запуске из командной строки; то же с ЗШ. Так что, видимо, что-то подозрительное в вашу команду. Я не знаю, что "##+(0)" будет готов выполнить, но "#0" не удастся вытащить один ведущий ноль. Это показывают способ, чтобы удалить произвольное количество нулей.

если там действительно есть разница между поведением в командной строке и из скрипта, то, скорее всего, скрипт использует другой переводчик (различные версии оболочки bash, баш вместо ЗШ) или другую оболочку варианты (попробуйте запустить shopt). Последнее различие может быть результатом интерактивной оболочке источников [F2] и $HOME/.profile, тогда как сценарии, как правило, не. Это не должно влиять на переменные окружения, так как они по наследству, если на экспорт, но это должно повлиять на параметры оболочки, которые должны быть установлены в каждом патроне.

2
ответ дан 2 August 2018 в 04:04

На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.

Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt ). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc и $ HOME / .profile , тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.

2
ответ дан 4 August 2018 в 20:08

На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.

Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt ). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc и $ HOME / .profile , тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.

2
ответ дан 6 August 2018 в 04:10

На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.

Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt ). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc и $ HOME / .profile , тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.

2
ответ дан 7 August 2018 в 22:09

На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.

Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt ). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc и $ HOME / .profile , тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.

2
ответ дан 10 August 2018 в 10:23

На ваш вопрос нельзя ответить в целом. Однако некоторые комментарии. В моей версии bash (3.1.17 (1) -release) ваша команда не имеет нужного выхода даже при запуске из командной строки; то же самое с zsh. Так что, по-видимому, что-то подозрительно в вашей команде. Я не знаю, для чего поддерживается «## + (0)», но «# 0» удаляет один ведущий ноль. Этот показывает способ удаления произвольных чисел нулей.

Если действительно существует разница между поведением в командной строке и скриптом, то, скорее всего, сценарий использует другой интерпретатор (другая версия bash, bash вместо zsh) или разные параметры оболочки (попробуйте запустить shopt ). Последнее различие может быть результатом вашего интерактивного shell sourcing $ HOME / .bashrc и $ HOME / .profile , тогда как сценариев обычно нет. Это не должно влиять на переменные среды, поскольку они наследуются при экспорте, но они должны влиять на параметры оболочки, которые необходимо установить в каждой оболочке.

2
ответ дан 13 August 2018 в 16:48
  • 1
    loevborg. Я добавил комментарий ниже моего вопроса об использовании ## + (0) ... и о моей текущей версии bash. – Peter.O 10 January 2011 в 14:21
  • 2
    Я добавил больше системных спецификаций в суть вопроса – Peter.O 10 January 2011 в 15:19
  • 3
    loevborg, вы были правы на своей цели с помощью ссылки shopt ... Все остальное похоже на одно и то же, и есть различия в настройках shopt , поэтому я попытался повторно найти веб-страницу, где я впервые столкнулся с этой командой ... На самом деле было намного легче найти это время:) ... Он упоминает, что extglob должен быть на ... my на для CLI, но выключен для скриптов! .... Когда я предшествую команде с shopt -s extglob , команды работают отлично! ... так спасибо за это! .... (Я не знаю, как сделать эту постоянную настройку, но я должен уметь ее выработать (надеюсь :) – Peter.O 10 January 2011 в 16:58
  • 4
    PS. Я только что нашел аккуратный и простой способ удалить ведущие «0», которые не требуют extglob ... its: var = «000123000»; echo & quot; $ [10 # $ var] & quot; Он использует преобразование числовой базы, поэтому он работает только для '0 .. другой метод - это string -based – Peter.O 10 January 2011 в 17:39
  • 5
    Не используйте $ [...] . Это устаревший синтаксис для математики в 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]*}}
6
ответ дан 25 May 2018 в 23:33
  • 1
    Спасибо Жилю, это отличный ответ, и мне нравится этот «новый». способ стримера привести 0, но я немного OD'd на нем в данный момент (это и еще несколько вопросов) .. Я вернусь к нему, когда я перезарядил свои батареи .. ... Я добавил 3 "strip-lead-0s " методы как сноска к моему вопросу .. Они могут быть удобны для кого-то ... мне потребовалось достаточно времени, чтобы найти их! :) – Peter.O 11 January 2011 в 13:24
  • 2
    В Ubuntu для интерактивных оболочек bash по умолчанию включено расширенное включение, потому что файл .bashrc по умолчанию /usr/share/bash-completion/bash_completion), который содержит shopt -s extglob progcomp ). – Eliah Kagan 9 January 2017 в 21:00

Предполагая, что вы используете одну и ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~/.bashrc читается интерактивными оболочками, но не с помощью интерпретаторов сценариев. Причина в том, что сценарии обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.

Многие вещи в типичных файлах .bashrc применяются только к командной строке (подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; обычно вы помещаете их в отдельный файл и отправляете его как из ~/.bashrc, так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории (!! и т. д.) включено по умолчанию только в интерактивных оболочках.

Здесь вы используете конструкцию +(…), которая является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob. Очевидно, вы имеете это в своем ~/.bashrc.

Вы можете поместить shopt -s extglob в свой скрипт или использовать переносимый способ усечения ведущего 0 s из переменной, такой как

var=${var#${var%%[!0]*}}
6
ответ дан 25 July 2018 в 22:38
  • 1
    Спасибо, Жиль, это отличный amswer и мне нравится этот "новый" способ прокладки, свинца '0... но я немного ПЕРЕДОЗ на нем в данный момент (он, и еще пара вопросов) .. я вернусь к нему, когда я перезарядить мои батареи..... Я добавил 3 "полоса-свинец-0С" методами, как сноску на мой вопрос.. они может быть пригодится кому-нибудь...он взял меня достаточно долго, чтобы найти их! :) – Peter.O 11 January 2011 в 13:24
  • 2
    В Ubuntu, интерактивные баш снарядов продлили подстановка по умолчанию, потому что пользователь по умолчанию .bashrc файл (отображается как /etc/skel/.bashrc) источники /usr/share/bash-completion/bash_completion, который содержит [F4] и. – Eliah Kagan 9 January 2017 в 21:00

предполагаю, что вы используете тот же Шелл в скрипте и в вашем терминале, основное различие заключается в том, что ~/.bashrc читается интерактивную оболочку, а не скрипт-перевод снарядов. Причина в том, что скрипты обычно предназначены, чтобы быть переносимой, и за то, что Вы не хотите зависеть от настроек пользователя.

многие вещи в типичном .bashrc файлы применяются только к командной строке равно (настройки подсказки, горячие клавиши). Некоторые, такие как определения функций, смысла в сценарии, а также, как правило, вы бы поместить их в отдельный файл и источник его от [F4], а скрипты. Иногда вы хотите, чтобы некоторые варианты оболочка для интерактивного использования, но не в сценарии, потому что они приводят к более коротким (хорош в командной строке), но более загадочным или менее портативный (плохо в скриптах) код. Есть несколько вещей, которые громят, - совсем по-другому, например, расширение история (!!, и т. д.). по умолчанию включена только в интерактивную оболочку.

здесь вы используете +(…) конструкт, который представляет собой КШ расширенные подстановка шаблона. Bash не включить их по умолчанию (для обратной совместимости), но вы можете включить их с shopt -s extglob. Видимо у вас это в вашей ~/.bashrc.

Вы можете положить [F9] в ваш скрипт, или использовать портативный способ усечения ведущих [F10]для S от переменных, таких как

var=${var#${var%%[!0]*}}
6
ответ дан 26 July 2018 в 23:16
  • 1
    Спасибо Жилю, это отличный ответ, и мне нравится этот «новый». способ стримера привести 0, но я немного OD'd на нем в данный момент (это и еще несколько вопросов) .. Я вернусь к нему, когда я перезарядил свои батареи .. ... Я добавил 3 "strip-lead-0s & quot; методы как сноска к моему вопросу .. Они могут быть удобны для кого-то ... мне потребовалось достаточно времени, чтобы найти их! :) – Peter.O 11 January 2011 в 13:24
  • 2
    В Ubuntu, интерактивные баш снарядов продлили подстановка по умолчанию, потому что пользователь по умолчанию .bashrc файл (отображается как /etc/skel/.bashrc) источники /usr/share/bash-completion/bash_completion, который содержит [F4] и. – Eliah Kagan 9 January 2017 в 21:00

предполагаю, что вы используете тот же Шелл в скрипте и в вашем терминале, основное различие заключается в том, что ~/.bashrc читается интерактивную оболочку, а не скрипт-перевод снарядов. Причина в том, что скрипты обычно предназначены, чтобы быть переносимой, и за то, что Вы не хотите зависеть от настроек пользователя.

многие вещи в типичном .bashrc файлы применяются только к командной строке равно (настройки подсказки, горячие клавиши). Некоторые, такие как определения функций, смысла в сценарии, а также, как правило, вы бы поместить их в отдельный файл и источник его от [F4], а скрипты. Иногда вы хотите, чтобы некоторые варианты оболочка для интерактивного использования, но не в сценарии, потому что они приводят к более коротким (хорош в командной строке), но более загадочным или менее портативный (плохо в скриптах) код. Есть несколько вещей, которые громят, - совсем по-другому, например, расширение история (!!, и т. д.). по умолчанию включена только в интерактивную оболочку.

здесь вы используете +(…) конструкт, который представляет собой КШ расширенные подстановка шаблона. Bash не включить их по умолчанию (для обратной совместимости), но вы можете включить их с shopt -s extglob. Видимо у вас это в вашей ~/.bashrc.

Вы можете положить [F9] в ваш скрипт, или использовать портативный способ усечения ведущих [F10]для S от переменных, таких как

var=${var#${var%%[!0]*}}
6
ответ дан 31 July 2018 в 11:20
  • 1
    Спасибо, Жиль, это отличный amswer и мне нравится этот "новый" способ прокладки, свинца '0... но я немного ПЕРЕДОЗ на нем в данный момент (он, и еще пара вопросов) .. я вернусь к нему, когда я перезарядить мои батареи..... Я добавил 3 "полоса-свинец-0С" методами, как сноску на мой вопрос.. они может быть пригодится кому-нибудь...он взял меня достаточно долго, чтобы найти их! :) – Peter.O 11 January 2011 в 13:24
  • 2
    В Ubuntu, интерактивные баш снарядов продлили подстановка по умолчанию, потому что пользователь по умолчанию .bashrc файл (отображается как /etc/skel/.bashrc) источники /usr/share/bash-completion/bash_completion, который содержит [F4] и. – Eliah Kagan 9 January 2017 в 21:00

предполагаю, что вы используете тот же Шелл в скрипте и в вашем терминале, основное различие заключается в том, что ~/.bashrc читается интерактивную оболочку, а не скрипт-перевод снарядов. Причина в том, что скрипты обычно предназначены, чтобы быть переносимой, и за то, что Вы не хотите зависеть от настроек пользователя.

многие вещи в типичном .bashrc файлы применяются только к командной строке равно (настройки подсказки, горячие клавиши). Некоторые, такие как определения функций, смысла в сценарии, а также, как правило, вы бы поместить их в отдельный файл и источник его от [F4], а скрипты. Иногда вы хотите, чтобы некоторые варианты оболочка для интерактивного использования, но не в сценарии, потому что они приводят к более коротким (хорош в командной строке), но более загадочным или менее портативный (плохо в скриптах) код. Есть несколько вещей, которые громят, - совсем по-другому, например, расширение история (!!, и т. д.). по умолчанию включена только в интерактивную оболочку.

здесь вы используете +(…) конструкт, который представляет собой КШ расширенные подстановка шаблона. Bash не включить их по умолчанию (для обратной совместимости), но вы можете включить их с shopt -s extglob. Видимо у вас это в вашей ~/.bashrc.

Вы можете положить [F9] в ваш скрипт, или использовать портативный способ усечения ведущих [F10]для S от переменных, таких как

var=${var#${var%%[!0]*}}
6
ответ дан 2 August 2018 в 04:04
  • 1
    Спасибо Жилю, это отличный ответ, и мне нравится этот «новый». способ стримера привести 0, но я немного OD'd на нем в данный момент (это и еще несколько вопросов) .. Я вернусь к нему, когда я перезарядил свои батареи .. ... Я добавил 3 "strip-lead-0s & quot; методы как сноска к моему вопросу .. Они могут быть удобны для кого-то ... мне потребовалось достаточно времени, чтобы найти их! :) – Peter.O 11 January 2011 в 13:24
  • 2
    В Ubuntu, интерактивные баш снарядов продлили подстановка по умолчанию, потому что пользователь по умолчанию .bashrc файл (отображается как /etc/skel/.bashrc) источники /usr/share/bash-completion/bash_completion, который содержит [F4] и. – Eliah Kagan 9 January 2017 в 21:00

Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.

Многие вещи в типичных файлах .bashrc все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc , так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !! и т. д.) включено по умолчанию только в интерактивных оболочках.

Здесь вы используете конструкцию + (...) , который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob . По-видимому, это у вас в ~ / .bashrc .

Вы можете поместить shopt -s extglob в свой скрипт или использовать переносимый способ усечения 0 s от переменной, такой как

  var = $ {var # $ {var %% [! 0] *}}  
6
ответ дан 4 August 2018 в 20:08

Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.

Многие вещи в типичных файлах .bashrc все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc , так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !! и т. д.) включено по умолчанию только в интерактивных оболочках.

Здесь вы используете конструкцию + (...) , который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob . По-видимому, это у вас в ~ / .bashrc .

Вы можете поместить shopt -s extglob в свой скрипт или использовать переносимый способ усечения 0 s от переменной, такой как

  var = $ {var # $ {var %% [! 0] *}}  
6
ответ дан 6 August 2018 в 04:10

Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.

Многие вещи в типичных файлах .bashrc все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc , так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !! и т. д.) включено по умолчанию только в интерактивных оболочках.

Здесь вы используете конструкцию + (...) , который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob . По-видимому, это у вас в ~ / .bashrc .

Вы можете поместить shopt -s extglob в свой скрипт или использовать переносимый способ усечения 0 s от переменной, такой как

  var = $ {var # $ {var %% [! 0] *}}  
6
ответ дан 7 August 2018 в 22:09

Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.

Многие вещи в типичных файлах .bashrc все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc , так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !! и т. д.) включено по умолчанию только в интерактивных оболочках.

Здесь вы используете конструкцию + (...) , который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob . По-видимому, это у вас в ~ / .bashrc .

Вы можете поместить shopt -s extglob в свой скрипт или использовать переносимый способ усечения 0 s от переменной, такой как

  var = $ {var # $ {var %% [! 0] *}}  
6
ответ дан 10 August 2018 в 10:23

Предполагая, что вы используете ту же оболочку в своем сценарии и в своем терминале, основное отличие состоит в том, что ~ / .bashrc читается интерактивными оболочками, но не интерпретируется скриптами. Причина в том, что скрипты обычно имеют несколько портативный характер, и для этого вы не хотите зависеть от настроек оболочки пользователя.

Многие вещи в типичных файлах .bashrc все равно применяются только к командной строке (параметры подсказки, привязки клавиш). Некоторые, как определения функций, имеют смысл и в сценариях; как правило, вы помещаете их в отдельный файл и отправляете его как из ~ / .bashrc , так и с помощью скриптов. Иногда вам нужны некоторые варианты оболочки для интерактивного использования, но не в сценариях, потому что они приводят к более короткому (хорошему в командной строке), но более загадочному или менее портативному (плохому в скриптах) коду. Есть несколько вещей, которые bash делает по-другому, например. расширение истории ( !! и т. д.) включено по умолчанию только в интерактивных оболочках.

Здесь вы используете конструкцию + (...) , который является расширенным шаблоном клонирования ksh. Bash не включает их по умолчанию (для обратной совместимости), но вы можете включить их с помощью shopt -s extglob . По-видимому, это у вас в ~ / .bashrc .

Вы можете поместить shopt -s extglob в свой скрипт или использовать переносимый способ усечения 0 s от переменной, такой как

  var = $ {var # $ {var %% [! 0] *}}  
6
ответ дан 13 August 2018 в 16:48
  • 1
    Спасибо Жилю, это отличный ответ, и мне нравится этот «новый». способ стримера привести 0, но я немного OD'd на нем в данный момент (это и еще несколько вопросов) .. Я вернусь к нему, когда я перезарядил свои батареи .. ... Я добавил 3 "strip-lead-0s & quot; методы как сноска к моему вопросу .. Они могут быть удобны для кого-то ... мне потребовалось достаточно времени, чтобы найти их! :) – Peter.O 11 January 2011 в 13:24
  • 2
    В Ubuntu для интерактивных оболочек bash по умолчанию включено расширенное включение, потому что файл .bashrc пользователя по умолчанию (доступен для просмотра в качестве /etc/skel/.bashrc ) источников / usr / share / bash-completion / bash_completion , в котором содержит shopt -s extglob progcomp . – Eliah Kagan 9 January 2017 в 21:00

Другие вопросы по тегам:

Похожие вопросы: