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

Я знаю, что существует что-то другое о среде Терминальной командной строки и среде в сценарии удара, но я не знаю, каково то различие...

Вот пример, который наконец привел меня спрашивать этот quesiton; это может спугнуть некоторые различия.

Я пытаюсь разделить ведущий '0 от числа с этой командой.

  • var="000123"; var="${var##+(0)}" ; echo $var

Когда я выполняю эту команду от командной строки Терминала, я добираюсь: 123

Однако, когда я выполняю его из сценария, это не работает; я добираюсь: 000123

Я использую Ubuntu 10.04 и попробовал все следующее результатами sam:

  • Терминал 2.30.2 GNOME
  • Konsole 2.4.5
  • #!/bin/bash
  • #!/bin/sh

Мой выпуск i486-pc-linux-gnu версии 4 1 5 1 удара (в терминалах и сценариях)

различия 'в shopt' между CLI и Сценарием:

    CLI   Script  
    on     off    checkwinsize    
    on     off    expand_aliases  
    on     off    extglob         
    on     off    histappend      
    off    on     hostcomplete    

Что вызывает это различие?

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


Вот является 3 удара способами разделить ведущий '0. (Я знал только один, когда я сначала задал этот вопрос),

var=0001230; var="$[10#$var]";           echo $var   # fastest= 1.00  integers only
var=0001230; var="${var##+(0)}";         echo $var   # slower x 1.25  works with strings, but requires shopt -s extglob
var=0001230; var="${var#${var%%[!0]*}}"; echo $var   # slower x 1.61  works with strings  
6
задан 11 January 2011 в 12:31

2 ответа

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

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

0
ответ дан 11 January 2011 в 12:31

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

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

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

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

var=${var#${var%%[!0]*}}
0
ответ дан 11 January 2011 в 12:31

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

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