LINUX.ORG.RU

Как в Bash-скрипте запомнить владельца и права доступа файла, и применить их к другому файлу?

 , ,


0

2

Пишу bash-скрипт для одного специфического Linux-дистрибутива. В нем нет и не будет программы sponge, а потому невозможно через sed редактировать файлы «напрямую», и надо редактировать через промежуточный файл.

cmd="sed -r 's/$regExp/$line/' $fileName > /tmp/sed.txt"
echo "$cmd" | bash
mv -f /tmp/sed.txt $fileName


При копировании этого промежуточного файла поверх редактируемого, надо постараться установить ему владельца и права доступа такими же, какие были у исходного редактируемого файла.

Поэтому перед копированием надо запомнить владельца/группу и права доступа. Владельца/группу запомнить достаточно просто из комбинации ls и cut. Права доступа в формате "-rw-r--r--" запомнить не проблема, но их затем нужно привести либо в формат ugo, либо в числовой формат, чтобы скормить это дело команде chmod.

Вопрос: как проще всего в bash-скрипте сделать копирование владельца, группы и прав доступа с одного файла на другой?

★★★★★

Ответ на: комментарий от cppsektant

cp -f /tmp/sed.txt $fileName && rm -f /tmp/sed.txt, клоун бездарный.

Коллега, за счет чего останутся права исходного файла?

Xintrea ★★★★★
() автор топика

как проще всего в bash-скрипте сделать копирование владельца, группы и прав доступа с одного файла на другой?

Тебе это тут не надо, но

chown --reference=СТАРЫЙФАЙЛ НОВЫЙ ФАЙЛ #владелец
chmod --reference=СТАРЫЙФАЙЛ НОВЫЙ ФАЙЛ #права
touch --reference=СТАРЫЙФАЙЛ НОВЫЙ ФАЙЛ #время изменения (если надо)

А вот это

echo "$cmd" | bash

— бредовая срань, не делай так никогда.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

echo «$cmd» | bash
бредовая срань, не делай так никогда.

Это очень удобная штука для отладки. Убираешь «| bash», и видишь какая команда сконструирована и будет выполнена. Видишь все символы без всяких подстановок. Можешь скопировать команду и выполнить в отдельной сессии bash.

Xintrea ★★★★★
() автор топика

echo "$cmd" | bash

Опять это извращение. Надо еще eval засунуть для большего «эффекта»

Чувак, тебе надо посмотреть по сторонам, чтобы хотя бы иметь предствление «что такое хорошо и что такое плохо»

anonymous
()
Ответ на: комментарий от anonymous

bash -x

Не входит в функции и подключаемые скрипты, как минимум.

Xintrea ★★★★★
() автор топика

Таки фигнёй ты маешься и свыше уже всё правильно сказали.

Простого

#!/bin/sh
set -ex
sed -i.bak 's/$regExp/$line/' $fileName

будет более чем достаточно.

beastie ★★★★★
()
Ответ на: комментарий от Xintrea

Зачем люди извращаются через sponge?

  1. Балбесы
  2. Не все программы имеют опцию -i
legolegs ★★★★★
()
Ответ на: комментарий от beastie

set -ex

Жесть. Смотрю man set - нет таких опций, info set - нет таких опций. Хорошо хоть догадался set --help глянуть.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от beastie

И ещё, как вариант для настоящий джедаев, которые не боятся ed:

#!/bin/sh
set -ex
ed $fileName <<EOF
s/$regExp/$line/g
w
EOF
beastie ★★★★★
()
Ответ на: комментарий от Xintrea

man set - нет таких опций

SET(1P)                     POSIX Programmer's Manual                     SET(1P)

       −e    When this option is on, when any command fails (for any of the  rea‐
             sons listed in Section 2.8.1, Consequences of Shell Errors or by re‐
             turning an exit status greater than  zero),  the  shell  immediately
             shall exit with the following exceptions:

       −x    The shell shall write to standard error a trace for each command af‐
             ter it expands the command and before it executes it. It is unspeci‐
             fied whether the command that turns tracing off is traced.

anonymous
()
Ответ на: комментарий от Xintrea

sed -i

А с этой опцией никаких подводных камней нет? Зачем люди извращаются через sponge?

есть подводные камни, для sed -i требуются rw права на каталог для создания и удаления временного файла, т.е rw на файл будет недостаточно

anonymous
()
Ответ на: комментарий от anonymous

«А что так можно было что ли?!»

Во, так правильнее :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.