Хранение списка в переменной

Как Ulrich сказал, можно сделать это путем включения userdir модуль.

На Debian это может быть сделано при помощи a2enmod утилита, которая включает или отключает модули Apache. Посмотрите man a2enmod.

В этом случае просто необходимо работать

sudo a2enmod userdir

и затем перезапустите сервер Apache для внесения изменения, вступают в силу. Обратите внимание, что userdir модуль находится в основном Apache, таким образом, Вы не должны устанавливать ничего дополнительного. Для ссылки конфигурация userdir находится в /etc/apache2/mods-available/userdir.conf.

Все a2enmod делает здесь создает символьную ссылку из /etc/apache2/mods-enabled каталог в файлы /etc/apache2/mods-available/{userdir.conf/userdir.load}. Вы могли также сделать это вручную. Т.е.

faheem@orwell:/etc/apache2/mods-enabled$ ls -la userdir.*
lrwxrwxrwx 1 root root 30 Feb  6 03:11 userdir.conf -> ../mods-available/userdir.conf
lrwxrwxrwx 1 root root 30 Feb  6 03:11 userdir.load -> ../mods-available/userdir.load

Затем поместите любой веб-материал, под которым Вы хотите сделать доступным ~/public_html, и затем это должно быть доступно от http://servername/~username.

3
19.12.2012, 14:52
4 ответа

Не использовать ls получить список файлов, особенно ls * это даст Вам много пустых строк для каталогов.

Вы могли использовать (который не всегда хорош):

for file in *781*; do
  echo "$file"
done

Который переживет файлы с пробелами, но не файлы с другими специальными символами.

Можно также сделать:

 find . -name "*781*" -print0 | while IFS="" read -r -d "" file; do
   echo "$file"
 done

Который является намного лучше, но не стандартным во всем UNIXes (Linux хорошо).

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

declare -a file_array
while IFS="" read -r -d "" file; do
  file_array[${#file_array[@]}]="$file"
done < <(find . -print0)

Для работы в ksh, где у Вас нет замены процесса:

typeset -a file_array
mkfifo mypipe
find . -print0 > mypipe &
while IFS="" read -r -d "" file; do
  file_array[${#file_array[@]}]="$file"
done < mypipe
rm mypipe

Для получения дополнительной информации можно проверить это и это.

3
27.01.2020, 21:32
  • 1
    +1 Хороший ответ. ksh88 и позже имеют замены процесса. mksh (и следовательно, pdksh и производные) не делают. ksh93 не смог прочитать разграниченный пустым указателем список до только месяц назад или так в очень последних альфах, в то время как mksh и большинство других подобных ksh оболочек с a read -d функция смогла в течение долгого времени. Таким образом, какие работы в большой степени зависят, на каком ksh Вы используете. Наконец, никакой ksh не имеет declare. Необходимо использовать typeset при работе с чем-либо кроме Bash. –  ormaaj 19.12.2012, 15:05
  • 2
    "... особенно ls-r *": Вы имеете в виду ls -R *. –  dubiousjim 19.12.2012, 15:12
  • 3
    @dubiousjim: просто ls * дает вывод, который не легко проанализировать, если один из файла является каталогом. Редактирование сделано. –  jfg956 19.12.2012, 15:15

Не уверенный, которые окружают Вас, используют, но с ударом

export filelist=`ls -lart *781* | awk '{print $9}'`
echo $filelist

как пример:

export filelist=`ls -l|awk '{print $4}'`
echo $filelist
root root sys nobody sys sys sys sys root sys bin root sys root other sys sys root root sys other root sys root sys sys root root
-1
27.01.2020, 21:32

Я не знаю, почему Ваши примеры не работают. Они работают здесь---, если я использую выражение шарика, которое соответствует любым файлам. Обратите внимание, что, если какое-либо из соответствий могло бы быть каталогом, и Вы не хотите перечислять содержание того каталога, необходимо добавить a -d отметьте к Вашему ls.

Необходимо не упустить то, что происходит, когда выражение шарика не соответствует никаким файлам. Bash имеет установку, можно включить с shopt -s failglob это дает ошибку в этом случае. В других оболочках, или когда эта опция не будет включена в ударе, Вы вместо этого получите само выражение шарика, как произведено. Если Вы просто делаете a echo nonmatching_expression* Вы будете видеть результат "nonmatching_expression*". Если Вы делаете ls nonmatching_expression*, ls должен бросить ошибку.

Как записано, обе из Ваших опций предполагают, что имена файлов не содержат пробела. Это из-за ls -l ... | awk '{print $9}'. Если Вы знаете, что Ваши имена файлов не содержат пробела, это прекрасно. (Но почему Вы используете ls -l ... | awk '{print $9}' вместо просто ls? Я предполагаю, что у Вас есть некоторая причина не декларация в вышеупомянутых примерах.)

Если Ваши имена файлов могли бы содержать новые строки, вещами будет существенно более твердый---, в который я не войду, что сделать в этом случае. Если они не будут содержать новые строки, но могли бы содержать другой пробел, то Вы могли опустить -l флаг на ls и опустите канал к awk. Затем Ваша первая опция сохранила бы во временный файл одно имя файла на строку. Те имена файлов могли содержать пробелы или вкладки (но не новые строки). Ваша вторая опция также сохранила бы одно имя файла на строку в переменную, однако они будут более тверды работать с.

Если Вы сохранили список имени файла к переменной, и имена файлов могли бы содержать некоторый пробел, то, несомненно, всегда необходимо будет заключить переменную в кавычки при расширении его: так использование echo "$filelist" нет echo $filelist.

Вот то, как я извлек бы данные:

Опция 1:

while IFS= read -r f; do
  do_stuff_with "$f"
done < tempo

Опция 2:

while IFS= read -r f; do
  do_stuff_with "$f"
done << EOF
$filelist
EOF

Эти методы разрешают Вам выполнять операции в цикле (изменяющий переменные, изменяя каталоги), который будет видим к остальной части сценария. Если Вы не заботитесь об этом, то Вы можете вместо этого иметь while ... done раздел в конвейере, например, как это:

echo "$filelist" | while IFS= read -r f; do
  do_stuff_with "$f"
done

В этом случае, целое while ... done конструкция выполняется в подоболочке и любых модификациях к переменным (включая цикличное выполнение f) только будет видимо в той подоболочке.

Bash и некоторые другие оболочки имеют переменные типа массив. Некоторые люди находят их легче работать с тем, когда имена файлов могли бы содержать пробел. Однако они являются менее портативными. И они не могут быть экспортированы. (Вы отметили свой вопрос как /environment-variables, чтобы мне подразумевает, что переменные будут экспортироваться. Но возможно Вы не имели в виду это тот путь.) Я не войду, как Вы могли бы достичь своих целей с переменными типа массив.

Если Вы знаете, что у Вас нет пробела в Ваших именах файлов, то является самым простым использовать Вашу опцию 2, и можно использовать этот метод:

for f in $filenames; do
    do_stuff_with $f
done

Здесь кавычки должны быть опущены вокруг $filenames и являются дополнительными вокруг $f.

-1
27.01.2020, 21:32

SUGGESTION, вдохновленный идеей анонимной трубы, и необходимостью использовать вывод функции в качестве входа в массив, я нашел, что ко-процесс может помочь.

MyFunction()
{ echo "One line" ; echo "Second line" ; echo "Third line" }

set -A array
MyFunction 'SomeInputToFunction' < /dev/null |&

while read -p -r line; do
    print "READING from co-process: $line"
    array[ ${#array[@]} ]="$line"
done

Вывод:

READING from MyFunction co-process: One line
READING from MyFunction co-process: Second line
READING from MyFunction co-process: Third line

Спасибо большое за предыдущие постеры! -Фернандо Гонсалес

0
27.01.2020, 21:32

Теги

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