LINUX.ORG.RU
ФорумTalks

Кто дурак?

 , , ,


0

1

Почему команда выдает ошибку если все предусмотрено её параметрами?

0 $ pushd /tmp
/tmp ~
0 $ echo 111 > 111
0 $ echo 222 > 222
0 $ mv -n 111 222
mv: not replacing '222'
1 $ # WTF
0 $ man mv
...
       -n, --no-clobber
              do not overwrite an existing file

       If you specify more than one of -i, -f, -n, only the final one takes
       effect.
...

★★★★☆

Сам спросил, сам ответил, приведя фрагмент мана. Ну убери -n, если не хочешь, чтобы отказывался от перезаписи.

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

Ну а mv возвращает 1. Он же не перенёс файл.

Проверяй существование файла с помощью test -f 222, если надо 0.

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

Тут проблема в том, что будет 0 при любом фейле mv (нет файла 111, кончилось место, нет прав, и т.д.), а ему надо именно только когда файл существует.

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

Да, но может и не надо. А так то с проверкой, наверно, самый правильный вариант

masa ★★★
()

Переделай алгоритм чтобы он не зависел от этого аспекта. Или перепиши на Си. mv вообще дурацкая команда если речь про скрипты, добиться от неё предсказуемого поведения, учитывающего все варианты обстоятельств, очень сложно, она заточена именно под интерактивное применение. Даже такую тривиальную штуку, как просто вызвать сисколл rename() и больше ничего не делать, она не умеет например.

Команда ln чуть более удобная но тоже не уверен что идеальна.

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

Код 0 обычно возвращают когда всё отработало штатно. mv не смог переписать файл, значит вернул код 1. Как по мне правильное поведение, потому что тебе надо узнать перезаписал он файл или нет. 1 значит что нет. А почему он не смог перезаписать - прав не хватило, ты ему сказал не перезаписывать если файл уже есть, место кончилось или ещё что-то это уже не важно. Для такой детальности тебе надо больше возвращаемой информации. Вот если бы GNU в своё время договорились о сообщениях об ошибках и типовых кодах (как в вебе с его 404 503 и прочем, то было бы сильно лучше, но что не сделали, то уже поздно)

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

Ты давай последовательно делай:

(base) user@user-System-Product-Name:~$ echo 111 > 111
(base) user@user-System-Product-Name:~$ echo 222 > 222
(base) user@user-System-Product-Name:~$ mv -n 111 222
mv: not replacing '222'
(base) user@user-System-Product-Name:~$ echo $?
1
(base) user@user-System-Product-Name:~$ bash --version
GNU bash, версия 5.2.21(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2022 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или более поздней <http://gnu.org/licenses/gpl.html>

Это свободное программное обеспечение. Вы можете изменять и распространять его.
НИКАКАЯ ГАРАНТИЯ не предоставляется в пределах, допускаемых законом.
(base) user@user-System-Product-Name:~$ mv --version
mv (GNU coreutils) 9.4
Copyright (C) 2023 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее <https://gnu.org/licenses/gpl.html>.
Это свободное ПО: вы можете изменять и распространять его.
Нет НИКАКИХ ГАРАНТИЙ в пределах действующего законодательства.

Авторы программы — Майк Паркер (Mike Parker), Дэвид Маккензи (David MacKenzie) и Джим Мейеринг (Jim Meyering).

На (base) не обращай внимание, это у меня conda.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine
0 $ pwd
/tmp
0 $ bash --version
GNU bash, version 5.3.9(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2025 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
0 $ ls -gG 111 222
-rw-r--r-- 1 4 Jan 17 21:37 111
-rw-r--r-- 1 4 Jan 17 21:37 222
0 $ mv -n 111 222
0 $ ls -gG 111 222
-rw-r--r-- 1 4 Jan 17 21:37 111
-rw-r--r-- 1 4 Jan 17 21:37 222
0 $ 
dmitry237 ★★★★★
()
Ответ на: комментарий от firkax
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char **argv) {
  int v;
  v = 0;
  if(argc==4 && !strcmp(argv[3],"-v")) { argc--; v=1; }
  if(argc!=3) { fprintf(stderr, "Usage: %s <src> <dst> [-v]\n"); return -1; }
  if(link(argv[1], argv[2])<0) {
    fprintf(stderr, "link(%s,%s) error %d (%s)\n", argv[1], argv[2], errno, strerror(errno));
    if(errno==EEXIST) return 0;
    return -1;
  }
  if(unlink(argv[1])<0) {
    fprintf(stderr, "unlink(%s) error %d (%s)\n", argv[1], errno, strerror(errno));
    return -1;
  }
  if(v) fprintf(stderr, "renamed %s -> %s\n", argv[1], argv[2]);
  return 0;
}

Переименовывает файл как ты хочешь. Директории переименовывать не умеет (для них нужна дополнительная логика, link() там нельзя, rename() будет затирать таргет если это файл, renameat2() некроссплатформенный). Перемещать между разными монтированиями не умеет.

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

Нет конечно, не долетим. Я тебе никак не могу дать ссылку, которую РКН ещё не заблокировал на технический ресурс (с 14 января почти весь англоинет заблочен рандомно на ТСПУ вообще без малейшей логики), где английским по белому будет написано что 1 возвращается как Catchall for general errors. А в понятие general errors входят все ошибки, кроме тех на которые есть отдельные коды (да там есть ещё 2, 126, 127, 128+n, 130 и 255 коды, от 2 до 126 как договоритесь так и будет, хотя есть распространённые варианты). Почему надо считать не успешную операцию копирования ошибкой, надеюсь объяснять не требуется.

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

Тут видишь какое дело, только в русском языке возможны конструкции вида

да нет, не знаю

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

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

ОС какая? Багрепорт напиши им.

Арч, меня устраивает эта логика кодов возврата. Когда обновитесь, тогда и пишите репорт.

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

ля-ля не надо. Параметры даны согласно инструкции. Ошибку надо возвращать если что-то не учтено параметрами.
В общем это БАГ (возможно специально заложенный)

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

На вопрос в заголовке ответ вроде бы очевиден. Пометь тему как решённую.

imul ★★★★★
()

У меня не такое поведение

$ mv -n 111 222 ; echo $?
0

$ cat 222
222

$ cat 111
111

У тебя mv это alias с доп. флагами?

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

Понимаю твоё непонимание, но вообще могу вообразить ситуации, где оба поведения были бы желательны.

В реальной задаче, если надо ехать а не шашечки, я бы использовал rsync.

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

Потому как я понял у mv будет 2 опции - -n, --no-clobber и --no-copy. С разным поведением в плане кода который будет возвращаться.

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

Правильно. А 1 говорит что файл не был перемещён. Причина по которой это произошло не важна.

Это не правильно при наличии -n, которая легитимизирует не переносить. Т.е. при -n перенёс или не перенёс – успех в любом случае, если конечно не перенёс по причине существования файла.

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

да нет, не знаю

Нет такой конструкции. есть «да нет, наверное», при этом «да» == «ну», т.е. не утверждение. И всё это равносильно «Highly likely No» )))

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

Иностранец? Или с окраин каких? В Москве и области на вопрос в моём детстве «Пойдём делать (что-то за что может влететь от родителей)?». Классическим ответом является «Да нет, не знаю…» Это значит что человек не может решить идти ему делать что-то или нет. Он сам вроде как не против, но ответственность брать на себя не готов. Убеждение на тему что ты если что скажешь что это твоя идея была его предкам в таком случае скорее всего склоняло к необдуманным действиям. Ответ нет говорит о том, что маловероятно будет его переубедить, т.к. это его решение и нежелание. А ответ не знаю говорит о том, что он сам не решил хочется ему это или нет и убеждать надо его (это будет весело и так далее), а не разгружать с него ответственность. Так что все 3 возможных ответа имеют разный смысл.

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

В СБП ещё и поребик вместо тротуара. Это их проблемы. А у меня пруф есть, что именно московский говор правильный. Вон с дядьками из МГУ спорь и с Ломоносовым, кто я такой чтоб с ними спорить.

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

Кстати, что такого загадочного в фразе «нет, не знаю» или «нет, не хочу»? Они весьма однозначны. Наличие «да» в твоё варианте?

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

Да, именно наличие да важно. Обе твои фразы имеют совершенно другой смысл - это отрицания, пусть и несколько смягчённые, как «мы вам перезвоним» при отказе в принятии на работу. «Да нет, не знаю» - это про ответственность и колебания в принятии решения. Потому даже на английский это очень плохо переводится, как и слово awkward на русский. Потому что обязательно потеряется часть смысла, хоть ты и сможешь найти похожее для конкретного контекста слово, которое более-менее сможет передать мысль, но без тонкостей и дополнительных смыслов.

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

Тут видишь какое дело, только в русском языке возможны конструкции вида

да нет, не знаю

Похожие конструкции возможны почти в любом языке. В английском что-то типа «no… I don’t know» или «yes… I don’t know» вполне себе встречается. Это же просто сначала дать ответ, а потом выразить неуверенность, от языка не то чтобы особо зависит. В английском этот первый ответ ещё иногда может с вопросительной интоннацией произноситься, особенно если речь идёт о чём-то, ответ на что предположительно знает сам вопрошающий.

P.S. И да, «well» перед этим тоже может присутствовать, а может и нет, как и «да» в русском, это не принципиально.

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

Это сомнения в том что был дан правильный ответ на вопрос. Тут другое )

Не другое, а ровно то же. Да, сомнения могут быть истинные, а могут условные/притворные. Суть от этого никак не меняется.

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

Короче спроси у ИИ, даже гугловского этот вопрос «как переводится на английский да нет не знаю», он похоже уже лучше ЛОРовцев в языке разбирается. Well, no, I don’t know это один из компромиссов в переводе, самый близкий, но не всегда верный, ещё можно Well, may be not, I don’t know. Суть в том, что в одной фразе согласие, отказ и сомнение сразу.

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

Нет там согласия. Там отказ и сомнение. Ничего особенного или языкоспецифичного в этом нет.

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

В общем это БАГ (возможно специально заложенный)

Ну вы ещё накиньте, что этот баг спецом для вас занесли. :)

anc ★★★★★
()

Кто дурак?

Ну просто крайне провокационно...

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

Уже зарепортили и исправили https://github.com/coreutils/coreutils/commit/9907b6f5dc3faf370c916c2f81bfcc3... жди обновления

Так наоборот же.

В coreutils 9.4 (из VoidLinux, например) поведение такое, как в описании темы (1).

В coreutils 9.9 (из ArchLinux, например) уже с этими исправлениями, и поведение такое, как у dmitry237 (0).

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

Только ввели новую опцию, а эту с таким поведением объявили депрекейтед.

peregrine ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)