我可能在这里做了一些愚蠢/明显错误的事情,但我试图用 curl 传入一个脚本并在 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'
答案1
我相信我刚刚发现了问题的根源。通过强制 TextWrangler 使用 Unix 样式的换行符 (LF) 而不是它显然一直在使用的 Windows 样式的换行符 (CRLF) 进行保存,我似乎已经解决了所有问题;我猜它之所以遇到麻烦是因为它试图运行命令“set\r”而不是“set”,或者“ls\r”而不是“ls”。看来我真正需要做的就是使用“tr”命令从 curl 输出中删除所有回车符(因为 Pastebin 显然使用的是 CRLF 换行符)。感谢大家的帮助!
答案2
您是否尝试过使用 $HOME 而不是 ~/
(未添加为注释,因为我的声誉不大于 50)
此外,您可以通过执行 ls 等并查看其内容来进行故障排除(如果“ls”不起作用,则尝试“/bin/ls”)...“set”是我最喜欢的命令之一...然后您可以看到您的 PATH 是什么等等。
答案3
我无法在没有看到你的实际脚本的情况下判断(提示,提示),但是你使用sh
而不是有什么理由吗bash
?在大多数现代系统中,sh
实际上是指向不同 shell 的链接(dash
例如),即使不是,调用bash
assh
也会改变其行为(从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.