Почему я не могу использовать переменные в качестве префикса к команде, чтобы установить переменные среды?

  1. Установите HostAPD:
  2.     yast -i hostapd
    
    1. Настройте hostapd в файле /etc/hostapd.conf, особенно учитывая настройки (ESSID будет тестовым, драйвер будет для драйвера WLAN, мост будет для моста, который вы создадите позже, канал произвольный, hw_mode = g означает скорость, как в A / B / G / N).
        driver=nl80211
        bridge=br0
        channel=3
        hw_mode=g
        auth_algs=1
    
    1. Запустите hostapd:
        hostapd /etc/hostapd.conf
    
    1. убедитесь, что вы видите WLAN с тестом ESSID, например на мобильном телефоне

    2. добавьте сетевой мост на свой компьютер с Linux (при условии, что wlan0 является вашим беспроводным сетевым устройством и 192.168.0.5 - это бесплатный IP-адрес в вашей подсети):

        brctl addif br0 wlan0
        ifconfig br0 192.168.0.5
    
    1. теперь вы, вероятно, захотите использовать свой компьютер с Linux в качестве шлюза NAT в Интернет, так что вы будете делать это (при условии, что ppp0 - это устройство, которое вы используете для выхода в Интернет в качестве обычно это происходит с модемами UMTS):
        echo 1 > /proc/sys/net/ipv4/ip_forward
        iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
        iptables -A FORWARD -i br0 -j ACCEPT
        iptables -A FORWARD -i wlan0 -j ACCEPT 
    
    1. Теперь вы захотите, чтобы ваш компьютер Linux был как dhcp-сервером, чтобы подключаемые устройства получали информацию о том, что этот компьютер является их шлюзом.

    2. Теперь вы захотите ввести функции безопасности, такие как WPA, чтобы ваше общение не могло быть прервано.

    Я написал это в блоге на http://www.linuxintro.org/wiki/Set_up_a_wireless_accesspoint

11
20.12.2018, 05:30
2 ответа

Я подозреваю, что это та часть эпизода, которая вас зацепила:

The words that are not variable assignments or redirections are expanded (see Shell Expansions). If any words remain after expansion, the first word is taken to be the name of the command and the remaining words are the arguments

Это из справочного руководства по Bash в разделе, посвященном расширению простых команд.

В примере cmd=bashпеременные окружения не установлены, и bash обрабатывает командную строку, расширяя параметры, оставляя bash -c "echo hi".

В примере prefix=hello=hiв первом проходе опять нет назначений переменных, поэтому обработка продолжается до раскрытия параметров, в результате чего получается первое слово hello=hi.

После обработки назначений переменных они не -повторно обрабатываются во время выполнения команды.

См. обработку и ее результаты вset -x:

$ prefix=hello=hi
+ prefix=hello=hi
$ $prefix bash -c 'echo $hello'
+ hello=hi bash -c 'echo $hello'
-bash: hello=hi: command not found
$ hello=42 bash -c 'echo $hello'
+ hello=42
+ bash -c 'echo $hello'
42

Для более безопасного варианта «расширения переменных» -как -«переменных среды», чем eval, рассмотрите предложение wjandrea оenv:

prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi

Это не совсем -назначение переменной строки команды, поскольку мы используем основную функцию утилиты envпо назначению переменных окружения команде, но она выполняет ту же цель. Переменная $prefixрасширяется во время обработки строки команды -, предоставляя имя=значение env, который передает его bash.

14
27.01.2020, 19:58

Потому что $prefixне является присваиванием. У @Jeff более длинное объяснение .

Вместо этого вы можете сделать то же самое с функцией:

$ prefix() { hello=hi "$@"; }
$ prefix bash -c 'echo "$hello"'
hi

...и вы даже можете сложить их, если хотите:

$ foo() { foo=123 "$@"; }
$ bar() { bar=456 "$@"; }
$ foo bar bash -c 'echo "$bar $foo"'
456 123
4
27.01.2020, 19:58

Теги

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