不小心使用了输出重定向 > 而不是管道 |

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

为了防止现有文件被重定向覆盖,请>使用noclobberinbash或任何类似 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)

  • @maaartinus 来吧,1)输入两个单独的字符而不是一个显然不太可能。2)显然备份是必不可少的,没有人建议OP不要进行备份,这个答案绝不建议没有备份,并且编辑器备份假设您已经在编辑器中编辑了文件。3)同样,您只考虑 OP 编写的代码,如在此特定示例中,但问题和此答案适用于机器上的 *任何* 文件,包括系统可执行文件。 (2认同)

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)

  • @gardenhead 这取决于系统的设置方式。`/usr/local` 用于特定于主机的内容(而不是通过网络挂载在主机之间共享的目录),并且可能会或可能不会被非 root 用户写入。 (4认同)
  • @gardenhead 当然,这是一个标准位置。我将 `/use/local/bin` 用于本地安装的脚本和可能被多个用户帐户使用的程序,而 `$HOME/bin` 用于单个用户的个人内容。两者都有价值。 (4认同)
  • `/usr/local/bin` 是用户创建的可执行文件和脚本的标准位置 (2认同)

小智 8

正如@casey 的评论所说,我强烈建议将重要的脚本放在git repo 下,远程同步(一个花哨的自托管平台就可以)。

通过这种方式,您可以免受人为错误的影响,例如将文件恢复到以前的工作状态并再次执行。