Как открыть TextEdit из командной строки Mac OS

Буквально только что задался примитивным вопросом — как и чем открыть файл /etc/hosts из командной строки Mac OS? Речь не о консольных программах, а о графических (GUI) приложениях. Сперва казалось, то все довольно просто.

Первый и самый простой вариант — воспользоваться командой open с ключами -t или -e, в первом случае файл откроется в редакторе по-умолчанию, во втором — в TextEdit.app.


~$ open -t /etc/hosts
~$ open -e /etc/hosts

Вообще, команда довольно универсальная, ей можно открыть локальный файл, папку, http ссылку, приложение и т.п. Наберите man open в Терминале — там много интересного. Этой же командой для моих целей можно воспользоваться иначе.


~$ open /Applications/TextEdit.app /etc/hosts

Результат будет тот же самый, причем не совсем тот, который требовался — TextEdit будет открыт от имени простого пользователя, у которого по-умолчанию нет прав на запись /etc/hosts. Забыл про sudo?


~$ sudo open /Applications/TextEdit.app /etc/hosts
Password:

Ввожу пароль, пытаюсь сохранить файл — по-прежнему не удается. То есть посмотреть файл можно, а изменить и записать — нет, в TextEdit не предусмотрен запрос пароля супер-юзера в случае отсутствия необходимых прав.

TextEdit — нет разрешения

Проблема в том, что sudo выполняет с правами root команду open, а та запускает TextEdit уже с правами текущего пользователя, у которого не хватает прав. Обойти эту особенность не удастся, только если открыть файл, сохранить на рабочий стол, а затем перенести в нужную папку, авторизовавшись в Finder — слишком много суеты.

Способ запустить TextEdit (или любое другое приложение) с правами администратора все-таки есть, хотя и не сильно простой.


~$ sudo -b /Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/hosts

Теперь процесс TextEdit действительно запущен с правами пользователя root, алилуйя. Обратите внимание на ключ -b, он запускает приложение «в фоне», иначе консоль будет ждать до закрытия приложения, причем нажав ctrl-c его можно принудительно и мгновенно закрыть.

Длинноватая команда вышла. Решение есть и на этот случай — можно сделать скрипт, который будет искать приложение по имени и запускать его с помощью sudo.


#!/bin/bash

if [ $# -lt 1 ]
then
  me=`basename $0`
  echo "Usage: $me [OSX Application]"
  exit
fi

myPath=/Applications:/Applications/Utilities:/Developer/Applications:$PATH
myPath=\"`echo $myPath | sed 's/:/" "/g'`\"

# Check our custom path and execute the first match
for thisPath in $myPath
do
  thisPath="`echo $thisPath | sed 's/\"//g'`"
  app=$thisPath/$1.app/Contents/MacOS/$1

  if [ -x "$app" ]
  then
    # We found it!
    shift
    sudo -b "$app" $*
    exit
  fi
done

# We didn't find anything.
echo 'Sorry, application not found.'

Автор скрипта назвал его sopen, файл сохранил в /usr/local/bin, далее надо сделать его выполняемым и множно пользоваться.


~$ chmod -x /usr/local/bin/sopen
~$ sopen TextEdit /etc/hosts

Вся эта суета совершенно не нужна для редактирования небольших файлов, типа того же /etc/hosts, для этого в Mac OS есть чудесный консольный редактор nano.


~$ sudo nano /etc/hosts

Для больших файлов (логи, дампы SQL и т.п.) я пользуюсь редактором TextMate, у которого имеется консольная «запускалка» по имени mate. Она тоже не умеет передавать привелегии редактору, но TextMate при сохранении не ленится спросить пароль.

Комментария 2

  1. не могу прописать пароль, просто тупо не пишется и не вставляется.
    т.е. строку: sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/hosts
    набираю, потом энтер, появляется password: …. и ничего не пишется
    что нужно сделать?

Добавить комментарий для tagmac Отменить ответ