Как создать символические ссылки в / usr / bin на Mac?

7690
user1934428

Окружающая среда: OSX Sierra, ядро ​​Darwin версии 16.3.0

Корневая проблема: я хочу использовать кучу сценариев оболочки в центральном хранилище, которые имеют #! / Usr / bin / zsh. На моем Mac zsh находится в / bin / zsh.

Попытка решения: хочу создать символическую ссылку

ln -s /bin/zsh /usr/bin/zsh 

Моя учетная запись имеет права администратора, но я не являюсь пользователем root, и я бы предпочел не включать пользователя root на этом Mac. Поэтому я сначала сделал

sudo su 

чтобы получить оболочку с привилегиями root и затем выполнить команду ln . Однако я все еще получаю сообщение об ошибке ln: / usr / bin / zsh: Операция не разрешена .

Вопросы:

  • Почему я получаю это сообщение об ошибке?

  • Что мне нужно сделать, чтобы создать ссылку?

  • Есть ли лучший способ достичь моей первоначальной цели? Обратите внимание, что исправление #! линии не вариант.

8
Why don't you just copy `/usr/bin/zsh` to `/bin/zsh`? Lenniey 7 лет назад 0
@Lenniey That way you're creating a loose copy that won't be updated together with the original. Mario 7 лет назад 1
@ Марио щенок ... конечно, ты прав. ОП: никогда не делай этого! ;) Lenniey 7 лет назад 0
@Lenniey - копия должна идти другим путем! И если вы можете скопировать, то вы можете ссылку. AFH 7 лет назад 1
@ АФХ, да, мой комментарий - полный беспорядок ... Lenniey 7 лет назад 0
Если файловая система поддерживается в Linux, загрузите LiveCD (я использую Ubuntu), и вы сможете создать ссылку после монтирования файловой системы. Ubuntu Live загружается в root, поэтому просто откройте терминал и используйте там свою команду. Я немного удивлен, обнаружив, что `/ usr` входит в число защищенных каталогов (см. Ответ Димитара): в Ubuntu именно там устанавливается большинство приложений. AFH 7 лет назад 0
If this doesn't work, then the only option is to create a front end to each of the scripts, using `mkdir $HOME/scripts`;`cd PathToScripts`;`for f in *; do echo -e "#/bin/zsh\n. PathToScripts/$f >$HOME/scripts/$f` and add `export PATH=$HOME/scripts:$PATH` to `.bashrc`. This is simplified by assuming that none of the scripts, `$HOME`, nor `$PATH` contains spaces or other `zsh` special characters. The solution uses two things: (1) by placing the local script directory at the head of `$PATH` the local front ends will always be found first; and (2) the `.` command ignores `#!` as simply a comment. AFH 7 лет назад 0
@AFH: This can't seriously be the only solution! I mean: OSX is basically BSD Unix - I don't think Apple expects the users to buy a separate Linux system, just for doing admin tasks on their machine! Before going this way, I would rather activate the *root* user for my system. This would for sure work, but I'm looking for an alternative way. user1934428 7 лет назад 0
@AFH: I just see from the response given by Dimitar, that even enabling the root user would not help in my case.... user1934428 7 лет назад 0
Большинство дистрибутивов Linux бесплатны, поэтому вам не нужно их покупать. Я предложил этот раунд только из-за комментария Димитра «пожалуйста, не делайте этого». Но настоящая проблема заключается в поставщике сценариев: каждая оболочка должна иметь запись в `/ bin /`, и реальное решение - заставить создателя сценария использовать правильный, совместимый заголовок сценария `#! / Bin / zsh`. Для справки: в Ubuntu есть записи в обоих каталогах, символические ссылки на отдельные записи в `/ etc /`, которые ссылаются на `/ bin / zsh5`, двоичный исполняемый файл! Сделайте из этого что хочешь. AFH 7 лет назад 0
Конечно, мне не нужно покупать систему Linux, но для этого мне понадобится отдельный компьютер. Я хотел бы иметь символические ссылки, и именно так я бы решил эту проблему в Linux, но, к сожалению, я не могу сделать это на Mac. user1934428 7 лет назад 0

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

11
13dimitar

Вы получаете это сообщение из-за защиты целостности системы Apple . Защита целостности системы включает защиту для следующих частей системы:

/System /usr /bin /sbin Apps that are pre-installed with OS X 

Пути и приложения, которые сторонние приложения и установщики могут продолжать писать, включают:

/Applications /Library /usr/local 

Это означает, что вы можете просто создать символическую ссылку в /usr/local/bin(она все еще находится в вашем $ PATH).

НО, похоже, вам специально нужно создать символическую ссылку в /usr/bin. Вы можете добиться этого, отключив защиту целостности системы (не делайте этого, просто отредактируйте сценарии ..). Вы можете отключить его (я сам не проверял !!!):

Click the  menu. Select Restart... Hold down command-R to boot into the Recovery System. Click the Utilities menu and select Terminal. Type csrutil disable and press return. Close the Terminal app. Click the  menu and select Restart.... 
You've missed the point: the questioner has scripts which specify `#!/usr/bin/zh` as the shell, so the solution he seeks is to link this location to where the shell actually resides, but as you say he is protected from doing this. Unless the protection is bypassed, the only solution would seem to be a batch edit of the scripts. AFH 7 лет назад 2
Ну да, вы правы, он должен редактировать сценарии (что может произойти с помощью одной команды). 13dimitar 7 лет назад 0
@Dimitar взгляните на вопрос: есть ли лучший способ достичь моей первоначальной цели? Обратите внимание, что исправление #! линии не вариант. Lenniey 7 лет назад 0
записка принята, я изменил свой ответ 13dimitar 7 лет назад 1

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