LINUX.ORG.RU

Bash конструкция

 


0

1

Доброго времени суток. Я еще дурачек, поясните пожалуйста сие конструкцию:

mkdir -p ${C_HOME}/build_info/c : > ${C_HOME}/build_info/${J_NAME}_deploy_time : > ${C_HOME}/build_info/${J_NAME}_version

Спасибо.


mkdir --help

Использование: mkdir [КЛЮЧ]… КАТАЛОГ…
Создает КАТАЛОГ(и), если он ещё не существует.
....
  -p, --parents      не выдавать ошибку, если существует, создавать родительские каталоги, если необходимо
....
а дальше лабуда какая-то.... Покажи файл.

Deleted
()

1. Команды тут надо заворачивать в тег code. Примерно так

mkdir -p ${C_HOME}/build_info/c : > ${C_HOME}/build_info/${J_NAME}_deploy_time : > ${C_HOME}/build_info/${J_NAME}_version


2. Данная команда явно с опечаткой, вместо : должно быть ; — в данном контексте : не означает ничего специального, поэтому mkdir воспримет это, как имя каталога, который надо создать (и создаст). А вот ; означает разделитель между командами.

3. Если заменить : на ; , то этот однострочник эквивалентен трём командам:
mkdir -p ${C_HOME}/build_info/c
.> ${C_HOME}/build_info/${J_NAME}_deploy_time[br]
.> ${C_HOME}/build_info/${J_NAME}_version[br]

где ${ИМЯ} заменится на значения переменных ИМЯ, первая команда создаст каталог ${C_HOME}/build_info/c со всеми промежуточными путями (т.е. если, например, каталога build_info не существует, то он тоже будет создан), за это отвечает ключ -p (за подробностями в man mkdir), две остальные команды создадут пустые файлы ${C_HOME}/build_info/${J_NAME}_deploy_time и ${C_HOME}/build_info/${J_NAME}_version (за подробностями в google://shell+redirection).

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

Хосспаде как же хочется Markdown...

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

Сколько ж багов с этим code было, и всё продолжают вылезать… и все детские.

Опять розовый понь свои копытца сунул туда, куда не просили?

Верните MRD, он всё починит (если не доломает)!

r3lgar ★★★★★
()

На самом деле твоя команда должны выглядеть так:

mkdir -p ${C_HOME}/build_info/c
: > ${C_HOME}/build_info/${J_NAME}_deploy_time
: > ${C_HOME}/build_info/${J_NAME}_version

Первая команда создаёт директорию (точнее всю цепочку директорий) и не жалуется, если директории уже существуют.

Команда : - это специальная команда, которая не делает ничего, однако вызывается она таким образом, что файлы _deploy_time и _version создаются пустыми или обнуляются, если уже существуют.

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

Я про то, что переменные в комментарии redgremlin (я намеренно его не кастую) я бы обернул в inline, для читабельности.

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

Не знаю, в какой логике это логичней. Компактней на 2 байта? Да. Читабельнее? Не сказал бы. Так было бы действительно понятно:

truncate -s 0 file1 file2

На счёт переносимости не скажу.

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

на TLDP наткнулся на сабж:

   : > filename
      # The > truncates file "filename" to zero length.
      # If file not present, creates zero-length file (same effect as 'touch').
      # The : serves as a dummy placeholder, producing no output.
Т.е. у ТС должно быть так:
mkdir -p ${C_HOME}/build_info/c 
: > ${C_HOME}/build_info/${J_NAME}_deploy_time 
: > ${C_HOME}/build_info/${J_NAME}_version

Deleted
()

Смотря на оригинал поста (который в HTML сохранился): https://pic4a.ru/89/eMN.PNG

Видим, что ТС на самом деле спрашивал про

mkdir -p ${C_HOME}/build_info/c
: > ${C_HOME}/build_info/${J_NAME}_deploy_time
: > ${C_HOME}/build_info/${J_NAME}_version

Так вот

  1. Создаем директорию по пути ${C_HOME}/build_info/c. Причем ключ -p заставляет команду mkdir создать целую цепочку из директорий (если что-то в пути не существует). Также с ключем -p команда mkdir не выдает ошибок если директория уже существует. ${C_HOME} (а также ${J_NAME} — подстановка значения переменных (C_HOME, J_NAME - имена переменных). Чтоб проверить что подставится можешь прямо перед сией твоей конструкцией написать:
    echo "C_HOME = $C_HOME"
    echo "J_NAME = $J_NAME"
    
  2. Команда : в bash синоним команде true. Последняя абсолютно ничего не делает а только завершается с нулевым кодом возврата (=успех). Далее идет перенаправление STDOUT этой же команды в файл > ${C_HOME}/build_info/${J_NAME}_deploy_time. Поскольку true (aka :) ничего не выводит на STDOUT, то имеем только побочный эффект от перенаправления: файл создается (или пересоздается) и остается пустым
  3. То же самое что и в предыдущем пункте
KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

Ответ выше. Здесь по смыслу задача не создать файл, а обнулить его, чтобы потом писать туда через ″>>″.

# The > truncates file «filename» to zero length.
mky ★★★★★
()
Ответ на: комментарий от mky

Здесь по смыслу задача не создать файл, а обнулить его

А ящетаю, что по смыслу имен файлов:

${J_NAME}_deploy_time
${C_HOME}/build_info/${J_NAME}_version
Что можно использовать их mtime как «deploy time» и «version»

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

или пересоздается

Занудства ради, truncate это не «пересоздается», а обрезается размер файла до нуля. Иначе бы пришлось к этому лирическому не пойми чего недотермину «пересоздается» добавлять кучу описаний: нет момента, когда файл пропадает, не меняется inode, все другие дескрипторы остаются связанные с этим же файлом и начнут читать EOF и записывать с нулевой позиции и так далее.

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