为什么 bash 找不到我明显存在的桌面文件夹?

为什么 bash 找不到我明显存在的桌面文件夹?

我可能在这里做了一些愚蠢/明显错误的事情,但我试图用 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例如),即使不是,调用bashassh也会改变其行为(从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.

相关内容