Подоболочка (подпроцесс/дочерний процесс )с собственным $BASHPID, не указанным `ps`

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

Однако не это на самом деле ломает ваш сценарий. Следующая проблема возникает из-за того, что вы пытаетесь разобрать 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"

1
13.11.2021, 19:34
0 ответов

Теги

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