Как вы определяете, находитесь ли вы в системе Linux или BSD внутри скрипта?

1385
Mikey T.K.

У меня есть довольно обширный выбор файлов точек, которые долгое время хранились в git-репо - я просто поддерживаю отдельную ветвь кода для bsd-isms (например, в Linux, чтобы получить цветной вывод ls, который вы делаете ls --color=auto, но на BSD-лайках, включая Mac OS, это так ls -g).

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

Проблема в том, что я понятия не имею, как это сделать.

Как мне узнать, нахожусь ли я в Linux или BSD из rc-файла скрипта или оболочки?

unameне будет работать с тех пор, я должен написать кучу логики для различных разновидностей систем. Mac говорит Darwin, FreeBSD и т. Д., Когда меня больше интересует базовый тип ОС, поскольку это повлияет на конкретный набор инструментов, с которыми я имею дело. Для моего примера выше, я использую BSD lsили GNU ls?

6
не достаточно "uname -o"? PS: Osx имеет дарвиновские корни. Lorenzo Von Matterhorn 11 лет назад 0
Вы видели [этот ответ о переполнении стека] (http://stackoverflow.com/a/394247/2001600)? Похоже, именно то, что вы после. John Bensin 11 лет назад 2
-o является недопустимым параметром для `uname`, который поставляется с Mac OS. Видишь, почему это такая проблема? ;) Mikey T.K. 11 лет назад 1
@JohnBensin Это подойдет! Не могли бы вы дать ответ, чтобы были начислены соответствующие баллы? Mikey T.K. 11 лет назад 0
Так как вопрос все еще остается в теме здесь, нет никакого вреда в этом. Но если кто-то хочет процитировать часть этого SO-ответа, вы должны дать ссылку назад и указать автора ответа. И вам, вероятно, не нужно цитировать весь ответ random 11 лет назад 1
Что касается меня, я не буду связывать это в новом ответе и брать очки от работы другого. до тех пор, пока его добавили в качестве комментария, это хорошо для меня. @ Случайное спасибо за подробное объяснение того, как реагировать. Lorenzo Von Matterhorn 11 лет назад 1
@LorenzoVonMatterhorn Я добавил это как CW-ответ. Комментарии не гарантированы, поскольку они являются гражданами второго сорта на сайтах SE. Кроме того, поскольку ссылки на другие сайты SE не отображаются на боковой панели «Связанные» или «Связанные», ссылку, скрытую в цепочке комментариев, не всегда легко найти для будущих посетителей, особенно если они не знакомы с сайтами SE. Вопрос просто выглядит без ответа. John Bensin 11 лет назад 2

2 ответа на вопрос

10
John Bensin

This Stack Overflow answer by Nicolas Martyanoff provides a complete solution. I tweaked it to use the newer syntax mentioned in the comments.

Determine the OS:

platform='unknown' unamestr=$(uname) if [ "$unamestr" = 'Linux' ]; then platform='linux' elif [ "$unamestr" = 'FreeBSD' ]; then platform='freebsd' fi 

Choose the right flags for ls:

if [ "$platform" = 'linux' ]; then alias ls='ls --color=auto' elif [ "$platform" = 'freebsd' ]; then alias ls='ls -G' fi 
0
Andrei Neculau

Оставляя в стороне обнаружение платформы (правильно выполненное через uname), нужно правильно выбирать не только флаги, но и путь к исполняемому файлу.

Вызов просто ls -Gозначает, что мне нужно дать любой псевдоним / function / executetable-found-in- $ PATH и запустить его с флагом -G. Этот псевдоним / функция / исполняемый файл может быть или не быть BSD в ОС BDS, может или не может следовать аргументам BDS, может быть или не быть той же самой версией, которую вы ожидали, и т. Д.

По этой причине, можно было бы использовать полный путь к встроенному в исполняемый файл, который имеет очень высокий шанс (скрипку с системой уровня не так часто, как возился с псевдонимами / функций / $ PATH) из следующих ОС: /bin/ls -G.

Похожие вопросы