Перемещение launchpad.db с пробелами

Рассмотрим следующий сценарий:

TODAY=$(date -j +"%j # %Y.%m.%d # %H.%M.%S")

LAUNCHPAD_LOCATION=$(getconf DARWIN_USER_DIR)com.apple.dock.launchpad
LAUNCHPAD_DESTINATION = "/Users/tobias/[DEVELOPMENT # ROOT]/LOCAL/PROJECTS/sh # TK-Launchpad.DB/"$TODAY""

mkdir "$TODAY"
mkdir "$LAUNCHPAD_DESTINATION"

cp -Rv $LAUNCHPAD_LOCATION $LAUNCHPAD_DESTINATION

Что не так с этим сценарием? Он должен скопировать папку Launchpad.db на недавнюю дату, отформатированную в $TODAY, но этого не происходит. И да, мне нужны места для дальнейшей обработки файлов и эстетических целей.

Я попытался скопировать файл launchpad.db во временную папку без пробелов и скобок, а затем переместить результат в новую папку с пробелами и скобками.

TODAY_1=$(date -j +"%j_#_%Y.%m.%d_#_%H.%M.%S")
TODAY_2=$(date -j +"%j # %Y.%m.%d # %H.%M.%S")

LAUNCHPAD_LOCATION=$(getconf DARWIN_USER_DIR)com.apple.dock.launchpad
LAUNCHPAD_DESTINATION_1 = "/Users/tobias/DEVELOPMENT_#_ROOT/LOCAL/PROJECTS/sh_#_TK-Launchpad.DB/"$TODAY_1""
LAUNCHPAD_DESTINATION_2 = "/Users/tobias/[DEVELOPMENT # ROOT]/LOCAL/PROJECTS/sh # TK-Launchpad.DB/"$TODAY_2""

cp -Rv $LAUNCHPAD_LOCATION $LAUNCHPAD_DESTINATION_1

mv -v "$LAUNCHPAD_DESTINATION_1" "$LAUNCHPAD_DESTINATION_2"

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

Кстати: есть ли более простое решение и, возможно, рабочее?

sh и zsh — это две совершенно разные оболочки, вы не можете использовать обе одновременно. Удалите тег для того, который вы не используете.
Ed Morton 26.08.2024 11:57

скопируйте/вставьте свой скрипт в shellcheck.net и прочитайте correct-bash-and-shell-script-variable-capitalization .

Ed Morton 26.08.2024 11:58

Очень редко сценарий выходит из строя молча, без каких-либо сообщений об ошибках (и вы не описали ни одного сообщения). Кроме того, вы не показали выполнение с включенной трассировкой (т. е. set -x), поэтому мы также не можем видеть содержимое ваших переменных. Наконец, как сказал Эд Мортон, определитесь, на каком языке написан сценарий — sh или zsh.

user1934428 26.08.2024 12:08

@EdMorton: Насколько я знаю, sh — это оболочка, выполняющая стандартную оболочку системы. В моем случае это ЗШ.

EL Sanchez 26.08.2024 14:45

@ELSanchez нет, sh - это оболочка, Bourne Shell (отличается от Bash, Bourne Again Shell и отличается от zsh). В любой системе возможно использовать псевдоним sh для какой-либо другой оболочки, но не рассчитывайте на это, поскольку это часто приводит к изменению поведения любой оболочки, к которой он привязан, так, например, bash будет вести себя по-разному, если он называется bash или называется как sh (я понятия не имею, как с этим справляется zsh, и я понятия не имею, имеет ли sh в вашей системе псевдоним bash или zsh или это действительно просто sh). Выберите шебанг для любого языка оболочки, на котором написан ваш сценарий.

Ed Morton 26.08.2024 14:52

@user1934428: user1934428: Извините за отсутствие оператора ошибки или выходных данных оболочки. Я скопировал только части своего сценария и забыл об этом, пытаясь разобраться с цитированием.

EL Sanchez 26.08.2024 14:53

Дополняя ответ ЭдМортона: если вы помечаете вопрос sh, вы явно запрашиваете бортовую оболочку. Если вы помечаете оболочку вопроса (и никакой другой тег оболочки), это означает, что вас интересует поведение оболочки POSIX. Для других оболочек укажите хотя бы имя оболочки, которую вы собираетесь использовать. Следовательно, вы можете пометить здесь только zsh или zsh и Shell (чтобы привлечь более широкую аудиторию), но тег sh не имеет смысла и его следует удалить.

user1934428 26.08.2024 14:59

Ничего страшного, что вы что-то забываете, но учтите, что вы можете редактировать вопросы и добавлять недостающие детали. Если вы этого не сделаете, вы рискуете, что вопрос будет закрыт модераторами.

user1934428 26.08.2024 15:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

TODAY=$(date +"%j # %Y.%m.%d # %H.%M.%S")

LAUNCHPAD_LOCATION = "$(getconf DARWIN_USER_DIR)/com.apple.dock.launchpad"
LAUNCHPAD_DESTINATION = "/Users/tobias/[DEVELOPMENT # ROOT]/LOCAL/PROJECTS/sh # TK-Launchpad.DB/$TODAY"
mkdir -p "$LAUNCHPAD_DESTINATION"

cp -Rv "$LAUNCHPAD_LOCATION" "$LAUNCHPAD_DESTINATION"

Надеюсь, теперь он разрешит ваш вопрос. В случае, если вы обнаружите какие-либо сомнения, спросите еще раз.

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

EL Sanchez 26.08.2024 14:55

@ElSanchez: Если вы действительно будете использовать zsh, как вы утверждали в своем вопросе, кавычки излишни, потому что zsh разбивает слова перед раскрытием параметра. Если цитирование помогло, я делаю вывод, что вы запускаете этот скрипт не как скрипт zsh.

user1934428 26.08.2024 15:03

@ user1934428: Моя строка shebang: #!/bin/sh . Я использую macOS Monterey. Системная оболочка — zsh, она связана с sh. Или другими словами: sh — это ссылка на zsh. Я пытаюсь быть толерантным к оболочке, и поэтому мой мозг говорит: #!/bin/env sh . Но в другой статье (stackoverflow.com/questions/53116226/…) говорится, что это не рекомендуется.

EL Sanchez 26.08.2024 17:48

@ElSanchez: Но zsh не ведет себя как обычный zsh. Поскольку он называется sh, он работает в режиме совместимости с POSIX, что означает, что он пытается действовать аналогично POSIX. В данном случае действительно кавычки нужны. В этом случае я бы пометил вопрос только оболочкой; не помешает упомянуть в тексте, что ваша оболочка POSIX представляет собой zsh в режиме POSIX. Я лично не одобряю такую ​​установку. Какой смысл быть «толерантным к оболочке» и что именно это должно означать? Я использую zsh, потому что мне нравятся его возможности, а не для имитации более простой оболочки POSIX.

user1934428 27.08.2024 07:58

@user1934428: user1934428: Я хочу быть максимально совместимым с «каждой» оболочкой, даже если zsh не установлен. Вот что я имею в виду под устойчивостью к оболочке. Поэтому я думаю, что с помощью #!/bin/sh эта цель будет достигнута.

EL Sanchez 28.08.2024 14:03

Другие вопросы по теме