首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

血的教训!解锁 source 命令新的姿势,已准备跑路。

  shayuvpn0001 · 31 天前 · 16280 次点击
这是一个创建于 31 天前的主题,其中的信息可能已经有所发展或是发生改变。

刚刚脑子也是抽了,觉得 history 里面 clear, exit, pwd 这种垃圾太多,总翻不到自己想找的以前的命令(某个 grep 正则表达式),于是准备拿.bash_history 开刀,vim 一番操作终于干掉了 clear, pwd 这种。

然后敲了一下 history,发现还没更新(应该是下次登录的时候重新载入),于是想到了用 source 更新一下。

高潮来了,我在命令行里敲下了 source .bash_history,一行行字符在屏幕飞速滚过,好像有什么不对。。。

左右翻看了一下,挂载到根目录下的硬盘被清空。。。

看了一下 history。。。

是不是已经凉了?还有救么?

第 1 条附言  ·  31 天前
From #22, @Liberal0
source FILENAME [arguments]:read and execute commands from FILENAME in the current shell.
第 2 条附言  ·  31 天前
我有些没理解,
为什么不是 cd 到 CrGuard 目录了吗? 为什么 rm -rf * 会删到 /下面?

source 的时候 cd 命令不起作用? 并且楼主是在 根路径下执行的 source ?

-------------------------------------------------------------
这是 N 年以前下载 CrGuard 的时候的操作,本来是手动在 Z 盘创建了一个 CrGuard 目录,然后 cd 进去的,git 下载了就拷贝出去了然后删除了 CrGuard。刚才 source 这一把执行到 cd CrGuard 这里必然是 No such file or directory,然后继续在 /z 执行了 rm -rf * -_-!!!!


这真的是美好的一天啊!!!
第 3 条附言  ·  31 天前
rm -rf 这种敏感操作,我还是很注意的。主要是没想到 source 这个浓眉大眼的也这么凶狠。。。
第 4 条附言  ·  31 天前
说用 sudo 能够拯救我的,放弃吧。你们更新环境参数 /配置的时候,也会加上 sudo 的吧,只要加了 sudo 提权,后面的都无解吧。你每次运行 source .bashrc 肯定前面会加上 sudo 的,所以这里我还是会加上 sudo 的。


====================醒!目!提!示!====================

这次事故是在 win7 系统下的 git bash 操作的, win 7 会把 C 盘, D 盘.... Z 盘挂在根目录上.
win7 下默认是管理员权限启动 git bash, 不存在 root 用户不 root 用户, 直接一把梭...
目前 Z 盘正在恢复中....

====================醒!目!提!示!====================

主要不是 sudo 的问题,也不是不注意 rm -rf 用法的问题.
是没想到 source 和.bash_history 这两个人畜无害的组合起来要了老命.
155 回复  |  直到 2019-01-19 18:37:52 +08:00
1  2  
    101
adminsam   31 天前   ♥ 1
“于是想到了用 source 更新一下” 你可真是个小机灵鬼呢
    102
RobertYang   31 天前 via Android   ♥ 1
太秀了吧,居然想用 source
    103
nonfxck   31 天前
总翻不到自己想找的以前的命令

这个可以换 ZSH 解决啊,ZSH 自带更智能的历史命令。在用或者方向上键查找历史命令时,zsh 支持限制查找。比如,输入 ls,然后再按方向上键,则只会查找用过的 ls 命令。而此时使用则会仍然按之前的方式查找,忽略 ls
    104
Beebird   31 天前
感觉楼主在发生这种事后,还是挺欢乐的,祝愿欢乐常伴你哦
    105
Malvo   31 天前
楼主是游离在天才边缘的人
    106
jimages   31 天前
@xi2008wang zsh_history 是有的
比如:
: 1529583012:0;cmake ls
: 1529583755:0;vim CMakeLists.txt.in
: 1529584232:0;cp ../3/CMakeLists.txt ./
: 1529584256:0;cp ../big/lib/gtest/CMakeLists.txt.in ./lib
: 1529584269:0;mkdir CMakeLists.txt.in
    107
zealinux   31 天前
```bash
sudo apt-get install trash-cli

echo >> ~/.bashrc <<EOF
alias rm=” trush-put ”
alias rm-trash="sudo rm -rf $HOME/.local/share/Trash/files/"
EOF
```
    108
lexuskingxx   31 天前
哈哈哈。。。赶紧跑路吧,楼主 。
    109
toyland   31 天前
如果楼主看了笔者命令行视频的第 2 集重温历史的话,或许不会酿成杯具,该视频教你数种查看、搜索及执行历史命令的方法: https://selfhostedserver.com/courses
    110
shayuvpn0001   31 天前 via iPhone
说用 sudo 能够拯救我的,放弃吧。你们更新环境参数 /配置的时候,也会加上 sudo 的吧,只要加了 sudo 提权,后面的都无解吧。你每次运行 source .bashrc 肯定前面会加上 sudo 的,所以这里我还是会加上 sudo 的。


====================醒!目!提!示!====================

这次事故是在 win7 系统下的 git bash 操作的, win 7 会把 C 盘, D 盘.... Z 盘挂在根目录上.
win7 下默认是管理员权限启动 git bash, 不存在 root 用户不 root 用户, 直接一把梭...
目前 Z 盘正在恢复中....

====================醒!目!提!示!====================

主要不是 sudo 的问题,也不是不注意 rm -rf 用法的问题.
是没想到 source 和.bash_history 这两个人畜无害的组合起来要了老命.
    111
MartinWu   31 天前
@shayuvpn0001 你觉得 source 人畜无害是真的 too young too naive。
    112
justff   30 天前
让我了解到一种跑路新姿势
    113
xuboying   30 天前
我都是 rm -rf ../xxx/* ,绝对不允许 rm -rf * 这种进入历史
防止按上下键翻出不小心直接回车
    114
avenger   30 天前 via iPhone
业务服务器删了,重新部署一台就是了,多大点事,有热备的话 dns 轮循改下,业务不会中断超过 10 分钟
    115
orm   30 天前
学习了
    116
shaoS   30 天前
令人窒息的操作
    117
doresu   30 天前   ♥ 5
    118
iwtbauh   30 天前 via Android
“说用 sudo 能够拯救我的,放弃吧。你们更新环境参数 /配置的时候,也会加上 sudo 的吧,只要加了 sudo 提权,后面的都无解吧。你每次运行 source .bashrc 肯定前面会加上 sudo 的,所以这里我还是会加上 sudo 的。”

source 是 bash 的内置命令,不能被 sudo 运行的。

同理也有

sudo echo xxx > /...

如果 shell 打不开 /...也是无法运行的
    119
Tyanboot   30 天前
@jimages 有也没用,这种格式的你 source 一下照样是会执行的。。。
    120
supervipcard   30 天前
原谅我笑出了声
    121
messyidea   30 天前
从来没有在 shell 里面用过 source,数据库里面倒是用过,导表的时候
所以说 zsh 大法好~记忆 history 比较方便
    122
helloworld000   30 天前
@messyidea ros programming 的话用的很多 source
    123
sodora   30 天前 via Android
root 敢死队嘛。正常~
就算没这次也会也有下一次。
    124
nicevar   30 天前   ♥ 1
v 站上每年能看到大量 linux 作死方式
    125
msg7086   30 天前
@shayuvpn0001 #110
source 和.bash_history 都不是人畜无害的。

source 是以当前用户环境执行程序而且不关心执行权限(所以可以执行任何程序),非常危险。
.bash_history 里有很多修改系统文件的命令,如果运行的话也非常危险。
可以说,这是两个非常危险的东西放在一起了。
    126
yuikns   30 天前 via iPhone
然而 source 不能 sudo

source filename
等价于
eval $( cat filename )

目的是当前环境执行命令,这样各种 export 在执行完毕后能用。前面加个 sudo,什么鬼
    127
applehater   30 天前
原来 source 是这个原理的啊,我还以为只是设置 export 而已
    128
juanyilxc   30 天前
一顿操作猛如虎,一看硬盘呜呜呜
    129
SharkIng   30 天前
为什么不用 Ctrl + r 搜索呢?
    130
JsonLee   30 天前 via iPhone
为啥用 source 来生效.bash_history 文件的修改呢?又为啥 source 要用 sudo 来执行呢?我觉得你是没理解 source 命令的作用。
    131
dychenyi   30 天前
跟 source 有啥关系,source 只是执行命令。
你要是在 makfile 里面写 rm rf / 让有权限的人 make 一把不是一样效果?
    132
stebest   30 天前
没事,只是把历史上做过的事在这里重新做了一下
    133
pkoukk   30 天前
哈哈哈哈哈,用 source 更新一下,楼主你真的是个天才
    134
TripleZ   30 天前 via Android
生活不易哈哈哈哈哈哈哈
    135
oakland   30 天前
@ABenmao 哈哈哈,感觉我已经把 source 屏蔽了
    136
samuel37   30 天前
害怕,source 里做删除操作这么危险吗
    137
jerryxiao   30 天前
fat/ntfs/ext 的话 用 photorec 还有救
    138
ww23xx   30 天前
@Tyanboot 「世界上的另一個我」
    139
aprilface   30 天前 via Android
梭哈啦
    140
neroxps   30 天前
生产环境中,就不应该用 f 命令~哪怕删除 10000 个文件,也应该按一万次 y
    141
master13   30 天前
我有一点不太明白,你想找 grep 那一行,为什么不把 history cat 出来直接 grep “ grep ”……
    142
CivAx   30 天前
@master13 #141 不用 cat,直接 history | grep "xx"

甚至直接 Ctrl+R 查找历史命令也是可以的
    143
smilepig   30 天前
能拿到硬盘的话,可以试试用软件恢复数据。。。
    144
mygoare   30 天前 via iPhone
太真实了!
    145
maxio   30 天前
一开始都没有理解到为什么 source .bash_history 可以更新。
后来 get 到了,果然还是楼主聪明,这样确实可以更新一把!
    146
ayanmw   30 天前
你居然用 source ~/.bash_history ....ni 应该怪 bash_history 为什么不加一个 # 前缀~~~
这不是 shell 脚本,只是文本,不能 source 的!!
    147
ayanmw   30 天前
rm -rf * 其实有一个 ie ext undelete 什么软件 是可以找回来的.不过 过于专业, 且碰到 容易犯错的你,还是算了吧!
    148
fox0001   30 天前 via Android
哈哈哈,此帖必火
    149
ml071987   30 天前
大佬,跑到哪了
    150
Ephen   29 天前
这波操作 666,后续如何了?
    151
nilai   29 天前
这是我看到的最好笑的笑话。。 。 不行了。 憋不住了。 又要笑了。。 哈哈哈哈。。。。 ^_^ ^_^ ^_^
    152
hackshen   29 天前
涨姿势了
    153
shellexy   29 天前
@nonfxck 这个用不着特地 zsh,

bash 只要在 ~/.inputrc 写上
```
## history search
"\e[A": history-search-backward
"\e[B": history-search-forward
## visible ring
set visible-stats on
## menu complete
"\C-n": menu-complete
```

就一样做到输入 ls 后再向上方向键只查找 ls 命令,
对楼主就是输入 grep 后再向上方向键只查找 grep 命令。


另外楼主更新历史记录只要 exec bash 就够了
    154
shellexy   29 天前 via Android
@JsonLee 咱怀疑楼主是之前是看到
“ source .bashrc 命令刷新 bash 配置”
类似的东西,
然后误以为 source 是刷新的意思,
所以误以为刷新历史纪录是
source .bash_history
    155
shayuvpn0001   28 天前
@shellexy 是的,你没猜错。。。脑子秀逗了。。。
1  2  
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2288 人在线   最高记录 4346   ·  
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 22ms · UTC 09:31 · PVG 17:31 · LAX 01:31 · JFK 04:31
♥ Do have faith in what you're doing.
沪ICP备16043287号-1