Я не иду в листы это оставшееся без ответа, потому что существует несколько вещей серьезно неправильно с этим сценарием. Однако, потому что я не знаю то, что сценарий, как предполагается, делает, этот ответ не собирается решать Вашу проблему.
chdir($directory);
может перестать работать. Необходимо обработать ошибку.
chdir($directory) or die "chdir($directory): $!";
$files .= "'$filename' "
не надлежащее заключение в кавычки на имя файла: это перестанет работать, если имя файла будет содержать a '
. Вы могли подготовить имя файла с $filename =~ s/'/'\\''/
, но существует на самом деле лучший способ сделать это (см. следующий вопрос).
system
с отдельным аргументом вызывает оболочку. Но Вы не используете функции оболочки, так вместо этого необходимо использовать форму списка. И тот способ, которым Вы не должны создавать строку, которая собирает все имена файлов: просто используйте список, который Вы уже имеете.
my @cmd = qw(/usr/bin/tar cvfz);
system(@cmd, $dest_path, @ARGV);
Все еще необходимо обработать ошибки от system
.
system(@cmd, $dest_path, @ARGV) or die "Call to $cmd[0] failed with status $?";
Если это - последняя вещь, Ваш сценарий делает, звонит exec
вместо этого.
exec(@cmd, $dest_path, @ARGV) or die "exec $cmd[0] failed: $!";
До сих пор Вы могли сделать все это легко в оболочке.
#!/bin/sh
set -e
cmd='tar cvzf'
dest_path='Archive.tgz'
cd -- "$(dirname -- "$0")"
echo "$cmd $dest_path $*"
exec $cmd "$dest_path" "$@"
Попробуйте этот сценарий:
( # Run in a subshell so it won't crash current color settings
dircolors -b >/dev/null
IFS=:
for ls_color in ${LS_COLORS[@]}; do # For all colors
color=${ls_color##*=}
ext=${ls_color%%=*}
echo -en "\E[${color}m${ext}\E[0m " # echo color and extension
done
echo
)
Вывод:
Эта версия имеет некоторую дополнительную информацию и не окрашивает все линии:
eval $(echo "no:global default;fi:normal file;di:directory;ln:symbolic link;pi:named pipe;so:socket;do:door;bd:block device;cd:character device;or:orphan symlink;mi:missing file;su:set uid;sg:set gid;tw:sticky other writable;ow:other writable;st:sticky;ex:executable;"|sed -e 's/:/="/g; s/\;/"\n/g')
{
IFS=:
for i in $LS_COLORS
do
echo -e "\e[${i#*=}m$( x=${i%=*}; [ "${!x}" ] && echo "${!x}" || echo "$x" )\e[m"
done
}
Часть Ответ @ Karthick87 на Askubuntu
Также см. Этот ответ: Что вызывает этот зеленый фон в LS-выходе?
IFS
все же. – chandra 23.10.2012, 21:48