ls
ведет себя по-разному при выводе в терминал или файл.
вывод в терминал по умолчанию идет в столбик, а вывод в файл - по одному файлу на строку.
просто используйте
ls -C
eval
подходит, если вы используете его правильно:
Func1() {
eval "$1=\$str1"
}
Безопасно, пока Func1
вызывается только с имена переменных, которые вы хотите передать.
Как всегда, переменные нужно заключать в кавычки. И здесь $ str1
не нужно расширять перед передачей в eval
.
Если в Func1
могут быть переданы произвольные строки, которые не находятся под вашим контролем, тогда у вас возникнут проблемы со значениями вроде reboot; foo
, и вам потребуется очистить его следующим образом:
Func1() {
case $1 in
"" |\
*[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]* |\
[0123456789]* |\
BASH* | LD_* | PATH | IFS | ENV | SHELLOPTS | PERL5LIB | PYTHON_PATH |...)
echo >&2 "Can't set that variable"
return 1
esac
eval "$1=\$str1"
}
Однако составить полный список проблемных переменных - обреченная задача.