С помощьюstar
(изschily-tools
)вы можете извлечь его с помощью:
star xf file.tgz -no-p -find -type d -chmod a+x
Чтобы добавить разрешение на выполнение (для всех )в извлеченные каталоги, чтобы исправить эти фиктивные разрешения в архиве.
С -no-p
umask
также применяется, даже если он запущен от имени пользователя root, что, предполагая, что ваш umask
равен как минимум 002, также исправит эти слишком широкие разрешения на запись (обратите внимание, что umask
имеет приоритет над-chmod
).
Обратите внимание, что ни одна из GNU tar
, bsdtar
или star
реализации tar
в моем тесте не имеет проблем с извлечением архива с такими нарушенными разрешениями. Скорее всего, вы пытаетесь извлечь его, когда уже существует каталог dist
без разрешения на поиск (, потому что, например, вы распаковали аналогичный архив с аналогичными нарушенными разрешениями ).
Прежде чем распаковывать архив, вам нужно исправить эти разрешения.
Сценарий, эквивалентный sh
тому, что представлено в вопросе:
#!/bin/sh
exe1='filepath'
n=1
var=exe$n
eval "echo \"\$$var\"" # or: eval 'echo "$'"$var"'"'
Строка eval
будет оценивать данную строку как команду в текущей среде. Данной строкой является echo \"\$$var\"
, которая после расширения переменных и т. д. станет echo "$exe1"
. Это передается в eval
для повторной -оценки, и команда печатает строку filepath
.
Вы также упоминаете массивы. Это правда, что оболочка POSIX sh
не имеет именованных массивов в том же смысле, что, например. bash
есть, но у него все еще есть список позиционных параметров.
С его помощью вы можете делать большинство вещей, которые вам нужно делать со списком в оболочке.
Например,
set -- 'filepath1' 'filepath2' 'filepath3'
for name in "$@"; do # or: for name do
echo "$name"
done
что то же самое, что просто
for name in 'filepath1' 'filepath2' 'filepath3'
do
echo "$name"
done
Поскольку я уверен в том, чего вы пытаетесь достичь, я не могу придумать более интересный пример. Но здесь у вас есть структура, подобная массиву -, которую вы повторяете. Почему вы хотите перебирать имена переменных, до сих пор не ясно.
Если вы хотите перебрать несколько файлов (, подразумеваемых из exe1=filepath
в примере ), работает ли простой цикл for?
final_file
— это переменная, содержащая последний файл, который соответствует файлу _шаблону -, реплицирующему последний аргумент bash ${!var}
(, ссылающийся на ).
#/bin/sh
final_file=''
file_pattern='*.txt'
for f in $file_pattern
do
echo $f
final_file=$f
done
echo $final_file