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 ★★★★★
()
Ответ на: комментарий от superuser

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

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 ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)