我有一个简单的脚本cmakeclean
来清理cmake临时文件:
#!/bin/bash -f
rm CMakeCache.txt
rm *.cmake
我称之为
$ cmakeclean
它确实删除了CMakeCache.txt,但它没有删除cmake_install.cmake
:
rm: *.cmake: No such file or directory
当我像以下那样运行时:
$ . cmakeclean
确实删除了两者。
有什么区别,我可以让这个脚本像普通的linux命令一样工作(前面没有.
)吗?
P.S。
我确信两次都是相同的脚本执行。为了检查这一点,我在脚本中添加了echo meme
并以两种方式重新运行。
答案 0 :(得分:10)
从-f
行中删除#!/bin/bash -f
。
-f
会阻止路径名扩展,这意味着*.cmake
将无法匹配任何内容。当您将脚本作为脚本运行时,它会解释shebang行,并且实际上运行/bin/bash -f scriptname
。当您将其作为. scriptname
运行时,shebang只会被视为注释行并被忽略,因此您在当前环境中没有设置-f
的事实允许它按预期工作。
答案 1 :(得分:0)
. script
是source script
的缩写,表示当前 shell执行脚本中的命令。如果那里有exit
,则当前 shell将退出(例如,终端窗口将关闭)。
这通常用于修改当前shell的环境(设置变量等)。
script
要求shell自行分叉,然后exec
子进程中的给定脚本,然后在父进程中等待终止子进程。如果脚本中有exit
,则子shell将执行此操作,因此只会终止此操作。父亲的外壳完好无损,并且没有改变。
这通常用于从当前shell启动其他程序。
答案 2 :(得分:0)
这是关于ClearCase的吗?你在贫穷的生活中做了什么,你被分配到最深处的地狱工作?
多年来,我是一名资深的ClearCase管理员。十多年来我没有碰过它。我的生活现在好多了。天空更蓝,鸟鸣更加悠扬,我每天上班的恐惧现在都少了。
回到你的问题:很难确切地说出发生了什么。 ClearCase做了一些古怪的事情。在动态视图中,Unix系统上的ClearCase存储库隐藏在shell的环境中。现在你看到了,现在你没有。
运行shell脚本时,它会启动一个新环境。如果某个特定的shell变量不是导入的,则该shell脚本是不可见的。当您仅从命令行运行cmakeclean
时,您将生成一个新shell - 一个不包含ClearCase环境的shell。
当您使用 dot 前缀(如. cmakeclean
)运行shell脚本时,您将在包含ClearCase环境的当前shell中运行该shell脚本。因此,它可以看到您的ClearCase视图。
如果您正在使用快照视图,则可能有$HOME/.bashrc
正在更改您的目录。当新的shell环境在BASH(MacOS X和Linux中的默认shell)中运行时,它首先运行$HOME/.bashrc
。如果这设置了特定目录,那么您最终会进入该目录,而不是在运行shell脚本的目录中。当我也参与ClearCase地狱时,我会看到这个。人们设置他们的.kshrc
脚本(这是BASH和大多数人使用Kornshell之前的几天)来设置他们的视图。不幸的是,这使得运行任何其他shell脚本几乎不可能。