Получите Возвращаемое значение sub сценария оболочки

Действительно необходимо квалифицировать то, под чем Вы подразумеваете, "определяет доменное имя" - существует по крайней мере три совершенно других интерпретации "домена", который мог бы применяться.

  1. Вы хотите установить Windows Domain, который система будет использовать для сетей SMB.

    Я не знаю бесцеремонно, как сделать это, но это, вероятно, включило бы редактирование Вашей конфигурации Samba; http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/domain-member.html#ads-member, вероятно, был бы хорошим местом, чтобы начать смотреть

  2. Вы хотите определить имя DNS по умолчанию (поиск)

    ответ llua выше устанавливает доменный компонент имени хоста, но если Вы хотите ping myhost для нахождения myhost в локальном домене DNS скажем, это - accounting.example.com, Вам нужна поисковая строка в/etc/resolv.conf, например:

    search accounting.example.com
    

    В некоторых системах/etc/resolv.conf управляет resolvconf система (это верно в моей системе Ubuntu, не уверено в Debian в целом или Crunchbang в особенности) - если/etc/resolv.conf является символьной ссылкой на/etc/resolvconf/run/resolv.conf затем, необходимо, вероятно, редактировать/etc/network/interfaces, который должен содержать строку файла конфигурации как это:

    iface eth0 inet static
               address 192.0.2.3
               netmask 255.255.255.0
               gateway 192.0.2.1
               dns-nameservers 192.0.2.1 198.51.100.1
               dns-search accounting.example.com example.com
    

    Если Вы используете DHCP для установки локальной сетевой конфигурации, демон DHCP должен настроить и локальное имя хоста и путь поиска сопоставителя DNS автоматически - можно найти, что это - лучшее решение или, чем llua's или, чем мой, по крайней мере, если существует локальный сервер DHCP, и это правильно настроено для предоставления информации о поиске DNS.

  3. Вы хотите установить NIS (YP) доменное имя, используемое для passwd/group/hosts/etc. поисков в некоторых системах с настроенным совместным доступом к файлам NFS.

    Вы могли бы сделать это путем редактирования/etc/domainname, и/или сразу (но временно) с domainname NISNAME команда. Обратите внимание, что доменное имя NIS не должно совпадать с доменным именем DNS (действительно, некоторые рекомендуют, чтобы это не было), хотя по крайней мере в некоторых случаях доменное имя NIS будет определено автоматически к доменному компоненту имени хоста если не иначе настроенный.

1
03.03.2013, 09:34
3 ответа

Я полагаю, что Вы на самом деле хотите:

#! /bin/sh -
until rv "$@"; do
  continue
done

Вы обычно не должны получать фактическое значение статуса выхода ($?) ни знать, действительно ли 0 TRUE или FALSE средств. until, while, if... конструкция заботится об этом. continue выше только для четкости, можно поместить любую команду там, включать не одну: :.

Никогда не используйте $* или $@ неупомянутый, который не имеет смысла.

2
27.01.2020, 23:39

Вы сохраните вывод из сценария в "r", код выхода был бы в $?.

Поэтому просто добавьте строку, прежде чем "сделано"

result=$?
0
27.01.2020, 23:39

В выражении

r=`vx $* < \`tty\` > \`tty\``

Bash интерпретирует vx как исполняемое имя файла, которому Вы передаете все ($*) из аргументов, переданных текущему сценарию после расширения оболочки. Например, если аргументы сценарию были * `ls /dev` затем список аргументов, переданный vx, будет названиями всех файлов в текущем каталоге плюс названия всех файлов в /dev. Количество аргументов совпадет с числом для имен файлов.

vx как предполагается, принимает вход на его стандартном входе.

tty исполняемый файл, который возвращает строку, которую Bash интерпретирует как имя файла.

Обратите внимание что первый вызов tty мог возвратить другое имя файла, чем второй вызов', например, если tty производит имя файла на основе некоторого внешнего условия, такого как содержание файла с именем, произведенным предыдущим вызовом, или на основе метки времени или другого внешнего условия, которое могло измениться.

Выражение r=`...` присваивает стандартный вывод команды backticked к r. Возвращаемое значение backticked выражения находится в $?.

Начиная со стандартного вывода vx перенаправляется к имени файла, произведенному вторым вызовом tty, значение r всегда будет пусто (r=) который совпадает с r=0 в выражении [[ r -ne 0 ]]. Результат состоит в том, что нет никакой ситуации, куда цикл может работать несколько раз.

0
27.01.2020, 23:39
  • 1
    $* не список аргументов, это - список файлов, соответствующих шаблонам, следующим из дальнейшего разделения аргументов на символах $IFS. Вам нужно "$@" для списка аргументов. деактивация –  Stéphane Chazelas 02.03.2013, 21:49
  • 2
    Как мог два tty возврат вызова другой результат? Их stdin является тем же. –  Stéphane Chazelas 02.03.2013, 21:57
  • 3
    Очень интересный анализ, но это помогает OP с проблемой? –  vonbrand 02.03.2013, 22:02
  • 4
    @vonbrand OP задал три вопроса. Я полагаю, что sepcifically ответил всем им. –  Jonathan Ben-Avraham 02.03.2013, 22:06
  • 5
    Нет "$*" был бы единственный аргумент строки. Попытайтесь назвать сценарий с теми тремя аргументами: the-script 'a b' '*' и посмотрите, сколько передается rv, и теперь сравните "$@". strace -fe execve может помочь. –  Stéphane Chazelas 02.03.2013, 22:12

Теги

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