LINUX.ORG.RU

centos, cp, bash

 , , ,


0

1

подскажите, пожалуйста, почему на нормальных здоровых человеческих подделиях работает:

cp /home/rat/.config/vim/userrc/key_russian-colemak.vim /usr/share/vim/vim[89]*/keymap/russian-colemak.vim

на rhel выдаёт ошибку:

cp: cannot create regular file '/usr/share/vim/vim[89]*/keymap/russian-colemak.vim': No such file or directory

если файл существует то rhel спрашивает перезаписать, даже с флагом --force. Но команда отрабатывает если не указывать в конце название файла:

cp /home/rat/.config/vim/userrc/key_russian-colemak.vim /usr/share/vim/vim[89]*/keymap/

Ведь bash перед выполнением команды вроде как должна разобрать vim[89]* и сделать подстановку? просто хочется какую-то универсальную команду написать чтобы не парсить, а есть там vim80 или vim82 или vim90 или что-то наподобие =(



Последнее исправление: SmilePlz (всего исправлений: 2)

Целевой каталог точно существует?

А вообще идея плохая, поскольку если каталогов, соответствующих маске, несколько, то соответствующие файлы из них тоже будут скопированы в последний, ибо развернётся это в несколько аргументов.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)

Каталога такого нету. В зависимости от флагов баш либо оставляет путь с маской как есть либо превращает в пустую строку (nullglob). Выясни у пакетного менеджера реальные пути к файлам.

rpm -ql vim

bga_ ★★★★
()

Очень плохая команда в начале. Означает она вот что:

Ищем существующие пути (да, во множественном числе) по маске /usr/share/vim/vim[89]*/keymap/russian-colemak.vim (да, ищем именно полный путь файла)

1) если такой файл уже есть и он строго один - то делаем то что ты хотел - копируем вместо него твйо файл из /home/rat

2) если таких файлов несколько (например, есть файлы /usr/share/vim/vim80/keymap/russian-colemak.vim и /usr/share/vim/vim90/keymap/russian-colemak.vim, то получается cp с тремя или больше аргументами, например:

cp /home/rat/.config/vim/userrc/key_russian-colemak.vim /usr/share/vim/vim80/keymap/russian-colemak.vim /usr/share/vim/vim90/keymap/russian-colemak.vim
который выдаст ошибку о том, что /usr/share/vim/vim90/keymap/russian-colemak.vim - не директория, а ты пытаешься в него скопировать два файла (первый и второй аргументы).

3) если под маску не подходит ни один файл, то cp попытается создать файл /usr/share/vim/vim[89]*/keymap/russian-colemak.vim прямо так, с квадратными скобками и звёздочкой в имени одной из директорий в середине и, поскольку такой директории у тебя скорее всего нет, напишет ту ошибку, которую ты и видишь.

Вторая команда (без имени файла) тоже плохая:

Ищем существующие пути по маске /usr/share/vim/vim[89]*/keymap/.

1) если такой нашёлся ровно один - то делается то что ты хочешь

2) если несколько - то опять поулчается cp с тремя и больше аргументами, которое напишет ошибку, что не стало копировать директорию из второго аргумента в директорию из последнего аргумента, т.к. ты не указал -r, но файл всё-таки скопирует (в последнюю найденную подходящую, а какая она будет и из нескольких - как повезёт)

3) если ни одной - напишет ошибку что путь с квадратными скобками и звёздочкой в имени не найдён

Ведь bash перед выполнением команды вроде как должна разобрать vim[89]* и сделать подстановку?

Подстановка делается только при полном соответствии маски реально существующему пути, включая имя файла после последнего слеша, которое тоже должно уже существовать.

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

А, да, понял, действительно не будут… Тут, правда, немного другая ситуация.

% mkdir vim1 vim2 vim3
% echo wanted_file > colemak
% echo file_from_vim1 > vim1/colemak
% echo file_from_vim2 > vim2/colemak
% echo file_from_vim3 > vim3/colemak
% cp colemak vim[123]/colemak       
cp: target 'vim3/colemak': Not a directory
CrX ★★★★★
()
Ответ на: комментарий от iron

Во-первых это раскладка для нестандартно раскладки клавиатуры в чтобы при смене раскладки в виме работали хотеки.

Во-вторых я бы и воспользовался ~/.config/vim да вот только у меня не получилось, всё что указано через set keymap=russian-colemak как я понял берётся из указанной выше директории. Буду рад использовать пользовательский каталог, подскажи если знаешь как.

В-третьих если подумать то этот каталог vim[89]* обычно в 99% случаев один, установку разных версий поддерживает только gentoo, но я не могу придумать ситуацию где бы это пригодилось. Предложите лучший вариант, буду использовать его.

Каталог существует. В debian, gentoo и тому подобных эта команда работает, а в rhel[89] нет и вопрос то в чём разница? cp, bash, версии одни и те же.

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

В-третьих если подумать то этот каталог vim[89]* обычно в 99% случаев один

На целый 1% пофиг что ли? (не сарказм)

Предложите лучший вариант, буду использовать его.

Ну конкретно с определением каталога выше подсказали.

Каталог существует.

Я понял, тут вот в этом проблема:

Ведь bash перед выполнением команды вроде как должна разобрать vim[89]* и сделать подстановку?

Да, но разбирать он будет не vim[89] в вакууме, а /usr/share/vim/vim[89]*/keymap/russian-colemak.vim, причём на предмет наличия таких файлов. Развернёт во все соответствующие маске. Если таковой файл там отсутствует, то скажет «No such file or directory» закономерно.

Пожалуй, лучшим вариантом в данном случае было бы (если бы мы не решили, что взять эту инфу из rpm лучше) cd /usr/share/vim/vim[89]*/keymap/ && cp /home/rat/.config/vim/userrc/key_russian-colemak.vim russian-colemak.vim

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

спасибо большое я проглядел сообщение от iron. У него как и у тебя красивое решение, обернуть это в () и будет красота, супер. По поводу 1% описать все возможные случае в скрипте это конечно можно, но порой это занимает намного больше времени, по крайней мере у меня, так что лучше всё таки где остановится.

SmilePlz
() автор топика
Ответ на: комментарий от iron

у меня скрипт который переносит мои настройки из гита на машину, в зависимости от режима (на текущую сессию, для пользователя, для системы). Я стараюсь избавится от команд специфичных для системы. Решение хорошее, но для идеологии скрипта не подходит.

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

Я стараюсь избавится от команд специфичных для системы.

# cat /etc/redhat-release 
CentOS Stream release 8
# find /usr/share/ -type d | awk '/vim[0-9].*keymap$/ {print;q}'
/usr/share/vim/vim80/keymap

# cat /etc/debian_version 
10.13
# find /usr/share/ -type d | awk '/vim[0-9].*keymap$/ {print;q}'
/usr/share/vim/vim81/keymap

# cat /etc/debian_version 
bullseye/sid
# find /usr/share/ -type d | awk '/vim[0-9].*keymap$/ {print;q}'
/usr/share/vim/vim81/keymap
iron ★★★★★
()
Ответ на: комментарий от SmilePlz

То, что ты всё делаешь неправильно и тебе дали рецепт «как надо» - это конечно хорошо. А ты понял ответ на первоначальный вопрос «почему на нормальных здоровых человеческих подделиях работает, а не rhel нет?» А то я чё-то туплю.

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

То, что ты всё делаешь неправильно

Иногда когда пишешь скриптик только для себя и хочешь чтоб было просто и универсально, глубоко плевать правильно это или неправильно.

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

Тут дело не в cp, а в том, как bash разворачивает []*

Но вообще мне трудно поверить, что хоть где-то это работает при отсутствии такого файла. bash не может знать, как это развернуть, если такого файла нет. Не может и не должен он «думать за пользователя», вдруг решив, что «даже если этот путь ни во что не разворачивается, давайте развернём его часть. Такое слишком «умное» поведение чревато проблемами в неожиданных местах.

Скорее всего в самом эксперименте что-то не так, и в «здоровых человеческих дистрибутивах» файл, соответствующий такому запросу, таки есть.

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

нет я не понял разницу, наверное это как в Си неопределённое поведение т.е. это зависит от реализации в тех или иных местах. Я не удивлюсь если что поведение rhel правильное. У меня пока нет времени капнуть глубже, может на выходных посмотрю в strace. Думал что ответ где-то на поверхности, поленился. Отпишусь к концу недели.

SmilePlz
() автор топика
Ответ на: комментарий от CrX

Скорее всего в самом эксперименте что-то не так, и в «здоровых человеческих дистрибутивах» файл, соответствующий такому запросу, таки есть.

Вот и я думаю, что эксперимент разный на разных дистрибутивах и человечность тут не при чём.

VIT
()