Bha*_*eja 21 linux pipe io-redirection
一个月前,我写了一个 Python 脚本来映射来自标准输入的 MAC 和 IP 地址。两天前我记住了它并用于过滤输出,tcpdump
但由于拼写错误而出错。我打字
tcpdump -ne > ./mac_ip.py
Run Code Online (Sandbox Code Playgroud)
输出什么都没有。但是如果无法解析输入,输出应该是“未知”,所以我做了cat ./mac_ip.py
并找到了所有tcpdump
数据而不是程序。然后我意识到我应该使用
tcpdump -ne | ./mac_ip.py
Run Code Online (Sandbox Code Playgroud)
有什么办法可以恢复我的程序吗?无论如何,我可以再次编写我的程序,但是如果它再次发生在更重要的程序中,我应该能够做一些事情。或者有什么方法可以告诉输出重定向检查文件并警告它是否是可执行文件?
jim*_*mij 38
为了防止现有文件被重定向覆盖,请>
使用noclobber
inbash
或任何类似 POSIX 的 shell 中的选项(也在(t)csh
该功能实际起源的地方,尽管您这样做set noclobber
而不是set -o noclobber
/set -C
那里)。然后,如果您需要强制替换文件,请使用>|
重定向运算符 ( >!
in (t)csh
)。
例子:
$ echo abc > file
$ set -o noclobber
$ echo xyz > file
bash: file: cannot overwrite existing file
$ echo xyz >| file
$ cat file
xyz
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可以使用以下命令检查当前设置set -o
:
$ set -o
...
monitor on
noclobber on
noexec off
...
Run Code Online (Sandbox Code Playgroud)
roa*_*ima 22
可悲的是,我怀疑你需要重写它。(如果你有备份,现在是时候把它们拿出来了。如果没有,我强烈建议你为未来建立一个备份制度。有很多可用的选项,但这个答案的主题。)
我发现将可执行文件放在一个单独的目录中,然后将该目录添加到PATH
. 这样我就不需要通过显式路径引用可执行文件。我个人(私有)脚本的首选程序目录是"$HOME"/bin
,它可以添加到程序搜索路径中PATH="$HOME/bin:$PATH"
。通常这会被添加到 shell 启动脚本.bash_profile
和/或.bashrc
.
最后,没有什么可以阻止您删除自己对所有可执行程序的写权限:
touch some_executable.py
chmod a+x,a-w some_executable.py # chmod 555, if you prefer
ls -l some_executable.py
-r-xr-xr-x+ 1 roaima roaima 0 Jun 25 18:33 some_executable.py
echo "The hunting of the Snark" > ./some_executable.py
-bash: ./some_executable.py: Permission denied
Run Code Online (Sandbox Code Playgroud)