Во время строительства www.firecode.io Недавно я столкнулся с более чем сотней провальных модульных тестов при запуске тестового набора локально на моей машине MacOS, а не в контейнере Linux Docker. Платформа настроена для запуска тестов.
Я использую MacBook Pro для разработки программного обеспечения, в первую очередь потому, что MacOS на основе BSD обеспечивает опыт разработки, который очень похож на другие дистрибуты Linux. Все мои наиболее часто используемые навигационные команды — CD
, сн
, MV
, Мкдир
, прикосновение
и т. Д. Работайте с паритетом 1: 1 по обоим ароматам операционных систем, или, по крайней мере, это то, что я думал. Как я обнаружил, потратив хороший час отладки этих неудач, существует тонкая разница между реализациями BSD и GNU cp -r
Команда, которую я получил при запуске моих тестов в разных средах.
Вот разница, проиллюстрированная с примером, проведенным как в MacOS, так и в Linux:
# Creates "source_directory" in the current working directory $ mkdir source_directory # Creates 2 new empty files within "source_directory" $ touch source_directory/{file1,file2} # Creates "destination_directory" in the current working directory $ mkdir destination_directory # Intended to copy the contents of "source_directory" to "destination_directory", hence the trailing slashes $ cp -R source_directory/ destination_directory/ # Lists the contents of "destination_directory" $ ls destination_directory
Итак, что бы вы ожидали напечатать с лауреат
? Оказывается реализация Linux GNU CP
копирует Source_directory
каталог в destination_directory
, в то время как на BSD macOS содержимое распаковано и копируется, так как я ожидал, что оно будет вести себя в обеих средах:
GNU (Linux):
$ ls destination_directory source_directory
BSD (macOS):
$ ls destination_directory file1 file2
Тропинг -черта является значимой в BSD, тогда как реализация GNU относится к обоим source_directory/
и Source_directory
то же. Обходной путь, к счастью, действительно прост — добавить период, когда вы собираетесь скопировать содержимое, и вы увидите одно и то же поведение как на BSD, так и на GNU: CP -R Source_directory/. destination_directory/.
Я надеюсь, что этот Tidbit поможет вам написать лучший код кросс -среды на MacOS и поможет вам сэкономить время отладки неожиданными результатами.
Оригинал: «https://dev.to/ackshaey/macos-vs-linux-the-cp-command-will-trip-you-up-2p00»