Чому Bash не знаходить мою явно існуючу папку Desktop?


1

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

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

Здається, це працює цілком коректно; однак перший рядок завантаженого сценарію не працює. Чомусь "cd ~ / Desktop" викликає помилку "Немає такого файлу чи каталогу". Я впевнений, що мій робочий стіл існує, і ця команда працює, коли я її запускаю вручну. Коли я спробував ввести "ls" як перший рядок для діагностики проблеми, він навіть не розпізнав команду. Чи потрібно щось мені робити, щоб такі команди, як "cd" і "ls" справно працювали?

Дякую за допомогу!

EDIT: Проблема, схоже, не має нічого спільного з curl, так як якщо я завантажую скрипт у "file.sh" і виконую "sh file.sh", я отримую ті самі помилки.

EDIT: Ось повний вміст сценарію, який я намагаюся запустити:

#!/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'

Ви отримуєте таку ж помилку з цим? curl -L path_to_my_script | ш-с
ред.

@ed. Ні, я не отримую помилки з цим, але він також не виконує сценарій. Я хочу виконати сценарій однією командою, щоб я міг просто запам'ятати команду і запустити її з будь-якої машини.
Хайден Шифф

Покажіть нам фактичний сценарій, який ви намагаєтеся запустити. Такі речі, як правило, зводяться до змінних умов навколишнього середовища, і важко дізнатися, що відбувається не так, якщо ви не скажете нам, що ви намагаєтеся зробити. Це добре працює, якщо ваш скрипт - це лише текстовий файл з echo "Hello World!"правом?
тердон

Гаразд, це дивно. Чи можете ви спробувати простий скрипт, який містить лише цей рядок echo "~/Desktop is : $(echo ~/Desktop)":? Переконайтеся, що у файлі немає нічого іншого, лише цей єдиний рядок. Спробуйте, наприклад, використовувати інший термінальний емулятор xterm. Terminal.app запускає оболонки для входу за замовчуванням, і це може ускладнювати речі (насправді не розумію, як, але ви ніколи не знаєте).
тердон

Ви дійсно повинні уникати запуску скриптів безпосередньо з веб-сервера, якщо можете. Шанс чогось поганого статися здається досить високим.
Zoredache

Відповіді:


2

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


1
Це дуже схоже на загальну проблему, коли перший рядок у сценарії виявляється #!/bin/bash^Mскоріше, ніж #!/bin/bash. :)
Hennes

Це добре пам’ятати про майбутнє.
MariusMatutiae

0

Ви спробували $ HOME замість ~ /
(не додано як коментар, оскільки я не маю репутації> = 50)
Крім того, ви можете вирішити проблеми, зробивши ls тощо і побачивши, що це говорить (якщо 'ls' не робота, потім спробуйте "/ bin / ls") ... "встановити" - одна з моїх улюблених команд ... тоді ви можете побачити, що таке ваш PATH і т.д.


Перехід на $ HOME не усуває проблему, а введення "/ bin / ls" замість "ls" викликає ще одну помилку "Немає такого файлу чи каталогу".
Хайден Шифф

Знайдіть щось, що працює ... що завгодно, і будуйте звідти. (це неоднозначно, якщо ви мали на увазі, що "ls" і "/ bin / ls" дали вам цю помилку, або якщо "/ bin / ls ~ / Desktop" дав вам цю помилку. "set" вбудований в оболонку .. якщо це не "Не працюй, тоді у тебе є більші проблеми.
9mjb

Також здається трохи дивним "<пробіл <(команда)". Чому б не просто "<(команда)". Вони майже однакові, але це здається трохи дивним. Ви можете спробувати використати "echo <(команда)" та "cat <(команда)", щоб побачити, чи отримуєте ви те, що ви думаєте, що отримуєте.
9mjb

Я вважаю, що різниця між двома форматами не має значення, оскільки моя помилка трапляється навіть при запуску сценарію з "bash file.sh". І я отримав помилку, коли мав "/ bin / ls" на одному рядку, нічого іншого. І ось результат запуску сценарію з рядком "set", доданим над рядком "ls": image . (ігноруйте помилки з пізнішими командами; до цих пір я ще не дійшов, і вони не мають значення на даний момент).
Хайден Шифф

Ця помилка "команда не знайдена" насправді говорить "команда не знайдена 2: встановити" так, нібито ви отримуєте там недруковані символи (як, наприклад, каретка повертається з Windows) ... можливо, спробуйте "od -c <(команда)" щоб побачити всі непарні символи у завантаженому файлі.
9mjb

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.

Спочатку у мене був просто "баш", а не "ш-стабільний", але коли у мене виникли проблеми, я спробував змінити речі, думаючи, можливо, я використовував неправильну оболонку ("стабільний" не мав сенсу і для мене, але це використав це, і я був поза ідеями). Переключення назад на "bash", здається, не виправляє проблеми. І добре, зараз я додам свій повний сценарій до початкового питання.
Хайден Шифф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.