РЕДАКТИРОВАТЬ: как отметили несколько других, возможно (и, как правило, лучше) получить список имен файлов непосредственно в php, вообще не задействуя сценарий оболочки. Но если вам нужно по какой-то причине использовать скрипт оболочки ...
Поскольку имена файлов unix могут содержать любой символ, кроме «/» и ASCII NUL (символ # 0) (а пути к файлам могут содержать «/»), стандартный способ передачи списков имен файлов заключается в разделителях NUL. Получить список имен файлов из такой команды, как ls
, которая не использует чистый формат, как этот, сложно, поэтому лучше получить список, просто используя необработанный шаблон (например, *
) и позволяя bash самому получить список. Одна небольшая хитрость в этой части заключается в том, что по умолчанию, если нет подходящих файлов, оболочка просто оставит там "*" вместо создания пустого списка, так что вы хотите, чтобы опция bash nullglob
была включена, и это bash -only функция (так что запустите это с bash
, а не только sh
!).
#! /bin/bash
cd /home/chb-pc/Desktop || exit
shopt -s nullglob # If there are no files, don't just print the "*"!
printf '%s\0' * # Print each filename followed by a NUL
В php есть и другая хитрость: в списке есть NUL после каждого имени файла, включая последнее, но explode
предполагает, что разделителями являются между элементами. В результате в конце массива появится пустой элемент, и вам нужно удалить его с помощью array_pop
.
<?php
$output = explode("\x00", shell_exec('bash /home/chb-pc/Desktop/files.sh'));
array_pop($output);
foreach ($output as $files) {
echo $files . "<br>";
}
?>