Ubuntu 16.04 LTS не просыпается с приостановкой, кроме того, нет & hd; Hibernate ” кнопка

Это проблема внутреннего полевого разделителя. Скорее, это не проблема, она была разработана именно так. Он разбивает входные пробелы, как и в позиционных параметрах.

На странице пользователя Bash:

для имени [[в [word ...]]; ] сделать список; done Перечисленный список слов, следующих в, расширяется, генерируя список элементов. Имя переменной по очереди устанавливается в каждый элемент этого списка, и список выполняется каждый раз. Если в слове опущено, команда for выполняет список один раз для каждого установленного параметра позиционирования. Статус возврата - это статус выхода последней выполняемой команды. Если расширение элементов, следующих в результатах в пустом списке, никаких команд не выполняется, а статус возврата равен 0.

Это означает, что он расширяет результаты выражения в список слов. Здесь находится внутренний разделитель полей, $ IFS. По умолчанию для $ IFS задано значение пробела (пробел, табуляция и новая строка). Это означает, что поле состоит из всего, вплоть до (но не включая) этих пробельных символов. Поскольку имена файлов состоят из пробелов, они обрабатывают их как несколько разных полей и запускают цикл один раз для каждого поля. Способ исправить это - настроить значение $ IFS.

Итак, вам нужно настроить $ IFS на что-то другое, кроме пробела. Используя ваш текущий метод, однако не было бы возможности указать, где заканчивается одно имя файла, а другое начинается, если у всех их нет расширения файлов. Более простой способ сделать это можно с помощью утилиты find следующим образом:

#Save the original IFS
oldifs=$IFS
#Set the new IFS to the ASCII null character \x00
IFS=$(echo -ne "\x00")

files="" #To prevent scoping issues

#Use the find utility to find and print just regular files (not directories),
#and not going further than ~/Downloads (remove '-maxlength 1' to make the
#search fully recursive), then print the filenames in the format
#file1\x00file2\x00file3\x00file4...

#However, since our new IFS is now \x00, the boundary upon which these filenames are
#separated now works as expected
for f in $(find ~/Downloads -maxdepth 1 -type f -print0)
do
  files="$files,$f"
done
echo "$files"

#Reset IFS
IFS=$oldifs

Я также хотел бы отметить, что ваше утверждение ls ~/Downloads | grep -v ^d, вероятно, не делает то, что вы ожидаете. Похоже, вы пытались отфильтровать каталоги, но то, что на самом деле происходит здесь, это то, что он отфильтровывает файлы, начинающиеся с 'd'. Это связано с тем, что вы не используете длинную форму ls, например ls -l. ls -l выводит вывод следующим образом:

drwxrwxrw- user group SomeDirectory size date_modified filename

wheras 'ls' печатает только имена файлов:

SomeDirectory
file1
file2
file3
1
задан 13 February 2017 в 14:15

0 ответов

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

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