Проблема с ls внутри скрипта bash

Отредактируйте/etc/sudoers(visudo)следующим образом:

# User privilege specification
root    ALL=(ALL:ALL) ALL
yael  ALL=(ALL:ALL) ALL

Затем запустите:

sudo -- sh -c 'echo "10.10.10.10 yael_host">> /etc/hosts'

Или

sudo sh -c 'echo "10.10.10.10 yael_host">> /etc/hosts'
2
07.09.2019, 17:49
1 ответ

Здесь есть две проблемы. Первый — цитирование. Вы должны привыкнуть всегда цитировать переменные. Подробнее об этом см.:

Однако не это на самом деле ломает ваш сценарий. Следующая проблема возникает из-за того, что вы пытаетесь разобрать ls. Почему это плохая идея, см.:

В частности, проблема заключается в том, что вы используете -b, из-за чего каталог с именем dir oneотображается как dir\ one. Если вы выберете это из своего средства выбора меню, вы запустите subdir_checkс dir\ oneв качестве аргумента. Поскольку цитируемое(varцитируется в функции ), вы пытаетесь запустить lsдля литерала dir\ one, экранированный пробел не читается как экранированный, поскольку вы цитируете. Однако, если вы не процитируете его, он будет прочитан как два отдельных аргумента. Так что все это немного беспорядок.

Вот рабочая версия вашего скрипта, использующая ваш базовый подход с небольшими изменениями:

#! /bin/bash
function subdir_check(){
  ## globs that don't match anything should expand to the empty string
  ## instead of expanding to the glob itself as happens by default
  shopt -s nullglob
  ## save all sub directories in the 'dirs' array
  local dirs=("$@"/*/);
  ## Print each dir on its own line and remove the trailing '/'.
  printf '%s\n' "${dirs[@]}" | sed 's|/$||'
}
## Remove the trailing '/' from the input.
directory=$(sed 's|/$||'<<<"$1")
## Quote all the things!
if [[ $(subdir_check "$directory") != "" ]]
then 
    ## You don't need a second variable. Just one: directory. This will now
    ## include the path.
    directory=$(subdir_check "$directory" | rofi -dmenu -p 'Select Subdirectory')
    while [[ $(subdir_check "$directory") != "" ]]
    do
        directory=$(subdir_check "$directory" | rofi -dmenu -p 'Select Subdirectory')
    done
fi
echo "$directory"
4
27.01.2020, 21:58

Теги

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