/bin
我在名为的新文本文件中写了ram
以下内容:
watch -n 1 free -h
和一个文件sen
:
watch -n 1 sensors
在同一文件夹中,以避免输入
watch blahblahblah...
每次。
另外,我改变了这两个的权限
-rw-r--r--
到
-rw-r--r-x
并实现了我的目标。即使重新打开 shell 后它也能正常工作,也就是说,我可以输入ram
而不是watch -n 1 free -h
但是,当我尝试同样的方法后,出现了问题
cd /home/myname/Downloads/
并将新文本文件保存在/bin
并命名dow
,权限相同。
这次dow
在终端上什么也不做,甚至没有显示任何消息。
我尝试将同一个文件保存在里面/usr/bin
,但终端仍然没有任何反应,我的工作目录也没有改变。
这怎么可能?
答案1
您编写了一个脚本,并且它可以工作。但它并没有达到您的预期,因为脚本在与调用它的 shell 不同的 shell 中运行。
脚本运行的 shell 完全按照脚本的指示执行操作;它将工作目录更改为~/Downloads
。它没有其他事情可做,因此退出。调用 shell 的目录没有更改。
您不必相信我的话 - 您可以通过在文件ls
的下一行中添加内容来演示dow
。当您运行命令时,将列出目录的内容(假设它有一些内容)(没有通常的颜色,这些颜色由非交互式 shell 无法读取的~/Downloads
别名提供)。~/.bashrc
要在当前 shell 中执行脚本,可以使用命令source
,也可以写成。因此,如果您输入. file
. dow
您的当前 shell 将改变目录。
或者,您可以设置一个别名:
zanna@toaster:~$ alias dow='cd $HOME/Downloads'
zanna@toaster:~$ dow
zanna@toaster:~/Downloads$
为了使其永久生效,请添加以下行
alias dow='cd $HOME/Downloads'
添加到您的~/.bashrc
文件中。然后每次运行交互式 shell 时它都会可用。
答案2
这是一个跨站点重复:https://stackoverflow.com/a/255415/383694。
问题是该脚本在子 shell 中运行。该脚本更改目录然后关闭,不会对当前 shell 造成任何更改。
两种缓解措施:
- 执行
. dow
使脚本在当前 shell 的上下文中运行。 - 使用别名,例如在执行目录更改的 ~/.bashrc 文件中--例如
alias dow="cd /home/myname/Downloads/"
。
如果您要更改目录,通常最好先测试一下它是否正常工作,然后再执行其他操作。
链接的问题中还有一些其他选项。