1

Я, вероятно, делаю что-то глупое / явно неправильное здесь, но я пытаюсь передать сценарий с помощью curl и запустить его в Terminal на OS X. Команда, которую я использую для этого:

sh -s stable < <(curl -L http://path_to_my_script/)

Это, кажется, работает совершенно правильно; однако первая строка в загруженном скрипте не работает. По какой-то причине «cd ~/Desktop» вызывает ошибку "Нет такого файла или каталога". Я совершенно уверен, что мой рабочий стол существует, и эта команда работает, когда я запускаю его вручную. Когда я попытался ввести "ls" в качестве первой строки для диагностики проблемы, он даже не распознал команду. Есть ли что-то, что мне нужно сделать, чтобы команды вроде "cd" и "ls" работали правильно?

Спасибо за помощь!

РЕДАКТИРОВАТЬ: Проблема, похоже, не имеет ничего общего с curl, как будто я загружаю скрипт в «file.sh», а затем выполняю «sh file.sh», я получаю те же ошибки.

РЕДАКТИРОВАТЬ: Вот полное содержание сценария, который я пытаюсь запустить:

#!/bin/bash
ls
cd ~/Desktop
curl https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg -o chrome.dmg
hdiutil attach chrome.dmg
cp "/Volumes/Google Chrome/Google Chrome.app" "~/Desktop/chrome.app"
hdiutil detach chrome.dmg
rm chrome.dmg
open -a chrome.app --args --make-default-browser --disable-instant-extended-api --    install-from-webstore="chrome-rdp/cbkkbcmdlboombapidmoeolnmdacpkch"
osascript 'tell application "System Preferences"
    activate
    set the current pane to pane id "com.apple.preference.mouse"
end tell'

3 ответа3

2

Я считаю, что только что обнаружил корень проблемы. Заставив TextWrangler сохранять с использованием разрывов строк в стиле Unix (LF) вместо разрывов строк в стиле Windows (CRLF), которые он, по-видимому, использовал, я, похоже, устранил все проблемы; Я предполагаю, что у него были проблемы, потому что он пытался запустить команду "set\r" вместо "set" или "ls\r" вместо "ls". Кажется, что все, что мне действительно нужно сделать, это использовать команду 'tr', чтобы убрать все символы возврата каретки из вывода curl (поскольку, очевидно, Pastebin использует разрывы строк CRLF). Спасибо всем за помощь!

0

Вы пробовали $ HOME вместо ~/
(не добавлено в качестве комментария, потому что у меня нет репутации> = 50)
Кроме того, вы можете устранить неполадки, выполнив команду ls и т.д. И увидев, что там написано (если «ls» не работает, попробуйте «/bin/ls»)... «set» - одна из моих любимых команд ... затем вы можете увидеть, что ваш путь и т. д.

0

Я не могу сказать, не видя ваш реальный сценарий (подсказка, подсказка), но есть ли причина, по которой вы используете sh вместо bash? В большинстве современных систем sh на самом деле является ссылкой на другую оболочку (например, dash), и даже если это не так, вызов bash поскольку sh меняет свое поведение (от man bash):

   If  bash  is  invoked  with  the name sh, it tries to mimic the startup
   behavior of historical versions of sh as  closely  as  possible,  while
   conforming  to the POSIX standard as well.  When invoked as an interac‐
   tive login shell, or a non-interactive shell with the  --login  option,
   it  first  attempts  to read and execute commands from /etc/profile and
   ~/.profile, in that order.  The  --noprofile  option  may  be  used  to
   inhibit  this  behavior.  When invoked as an interactive shell with the
   name sh, bash looks for the variable ENV, expands its value  if  it  is
   defined,  and uses the expanded value as the name of a file to read and
   execute.  Since a shell invoked as sh does not attempt to read and exe‐
   cute  commands from any other startup files, the --rcfile option has no
   effect.  A non-interactive shell invoked with  the  name  sh  does  not
   attempt  to  read  any  other  startup files.  When invoked as sh, bash
   enters posix mode after the startup files are read.

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

bash <(curl -L http://path_to_my_script/)

Я не знаю, для чего там была stable и опция -s равно не нужна, она активируется автоматически при отсутствии аргументов:

   -s        If the -s option is present, or if no arguments remain  after
             option  processing,  then commands are read from the standard
             input.  This option allows the positional  parameters  to  be
             set when invoking an interactive shell.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .