Bash и PHP, цитирование аргументов командной строки - PullRequest
2 голосов
/ 16 сентября 2009

У меня есть программа PHP, которая использует скрипт Bash для преобразования PDF. Однако, если имя файла содержит пробелы, оно не проходит корректно через скрипт bash.

Как вы избегаете имен файлов с пробелами в скрипте bash? Вам нужно сделать что-то особенное, чтобы процитировать имя файла для переменной "OUTFILE"?

Скрипт Bash:

#!/bin/bash

INFILE=$1
OUTFILE=${INFILE%.*}

gs \
-q \
-dSAFER \
-dBATCH \
-dNOPAUSE \
-sDEVICE=png256 \
-r150x150 \
-sOutputFile=${OUTFILE}.png \
${INFILE}

PHP скрипт:

echo "converting: ".$spool.$file . "\n";
system("/home/user/bin/pdf2png.sh " . escapeshellarg($spool . $file));

Редактировать: Я удалил кавычки вокруг переменной escapeshellarg (). Это, однако, не решило проблему. Что я думаю, в переменной OUTFILE сценария Bash.

Ответы [ 4 ]

3 голосов
/ 16 сентября 2009

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

"${INFILE}"
2 голосов
/ 16 сентября 2009

Учитывая ваш код, я бы попытался, во-первых, удалить одиночные кавычки, которые вы вставляете вокруг параметра: в них нет необходимости, поскольку вы используете escapeshellarg.

Например, файл temp.php может содержать:

$spool = "ab cd/";
$file = "gh ij";
system("sh ./test.sh " . escapeshellarg($spool . $file) . "");

А test.sh:

#!/bin/bash
INFILE=$1
echo $1

С этими данными вывод:

$ php temp.php
ab cd/gh ij

Что похоже на то, что вы ожидаете.


Если я положу обратно одинарные кавычки, как это:

system("sh ./test.sh '" . escapeshellarg($spool . $file) . "'");

Выход снова прерван:

$ php temp.php
ab

escapeshellarg экранирует данные для вас (с правильными кавычками и всем этим, в зависимости от операционной системы) , вам не нужно делать это самостоятельно.

0 голосов
/ 16 сентября 2009

Взгляните на escapeshellcmd () и escapeshellarg ()

0 голосов
/ 16 сентября 2009

Чтобы экранировать имя файла с пробелами, просто используйте.

My Tar Ball.tar

My\ Tar\ Ball.tar

Так что для того, что у вас есть, вам нужно будет либо убедиться, что ваши аргументы содержат обратную косую черту при вызове скрипта, либо вам нужно будет добавить некоторую проверку ввода.

...