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

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

  shayuvpn0001 · 2019-01-17 10:44:43 +08:00 · 23393 次点击
这是一个创建于 1897 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

看了一下 history。。。

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

第 1 条附言  ·  2019-01-17 11:32:51 +08:00
From #22, @Liberal0
source FILENAME [arguments]:read and execute commands from FILENAME in the current shell.
第 2 条附言  ·  2019-01-17 11:33:35 +08:00
我有些没理解,
为什么不是 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 条附言  ·  2019-01-17 11:34:22 +08:00
rm -rf 这种敏感操作,我还是很注意的。主要是没想到 source 这个浓眉大眼的也这么凶狠。。。
第 4 条附言  ·  2019-01-17 17:02:25 +08:00
说用 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 这两个人畜无害的组合起来要了老命.
156 条回复    2019-10-28 10:42:51 +08:00
1  2  
adminsam
    101
adminsam  
   2019-01-17 15:57:51 +08:00   ❤️ 1
“于是想到了用 source 更新一下” 你可真是个小机灵鬼呢
RobertYang
    102
RobertYang  
   2019-01-17 15:58:10 +08:00 via Android   ❤️ 1
太秀了吧,居然想用 source
nonfxck
    103
nonfxck  
   2019-01-17 16:09:47 +08:00
总翻不到自己想找的以前的命令

这个可以换 ZSH 解决啊,ZSH 自带更智能的历史命令。在用或者方向上键查找历史命令时,zsh 支持限制查找。比如,输入 ls,然后再按方向上键,则只会查找用过的 ls 命令。而此时使用则会仍然按之前的方式查找,忽略 ls
Beebird
    104
Beebird  
   2019-01-17 16:15:31 +08:00
感觉楼主在发生这种事后,还是挺欢乐的,祝愿欢乐常伴你哦
Malvo
    105
Malvo  
   2019-01-17 16:25:34 +08:00
楼主是游离在天才边缘的人
jimages
    106
jimages  
   2019-01-17 16:26:07 +08:00
@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
zealinux
    107
zealinux  
   2019-01-17 16:35:05 +08:00
```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
```
lexuskingxx
    108
lexuskingxx  
   2019-01-17 16:46:22 +08:00
哈哈哈。。。赶紧跑路吧,楼主 。
toyland
    109
toyland  
   2019-01-17 16:52:35 +08:00
如果楼主看了笔者命令行视频的第 2 集重温历史的话,或许不会酿成杯具,该视频教你数种查看、搜索及执行历史命令的方法: https://selfhostedserver.com/courses
shayuvpn0001
    110
shayuvpn0001  
OP
   2019-01-17 17:16:00 +08:00 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 这两个人畜无害的组合起来要了老命.
MartinWu
    111
MartinWu  
   2019-01-17 17:19:54 +08:00
@shayuvpn0001 你觉得 source 人畜无害是真的 too young too naive。
justff
    112
justff  
   2019-01-17 17:49:46 +08:00
让我了解到一种跑路新姿势
xuboying
    113
xuboying  
   2019-01-17 17:57:27 +08:00
我都是 rm -rf ../xxx/* ,绝对不允许 rm -rf * 这种进入历史
防止按上下键翻出不小心直接回车
avenger
    114
avenger  
   2019-01-17 18:00:25 +08:00 via iPhone
业务服务器删了,重新部署一台就是了,多大点事,有热备的话 dns 轮循改下,业务不会中断超过 10 分钟
orm
    115
orm  
   2019-01-17 18:19:53 +08:00
学习了
shaoS
    116
shaoS  
   2019-01-17 18:22:45 +08:00
令人窒息的操作
doresu
    117
doresu  
   2019-01-17 18:27:30 +08:00   ❤️ 5
iwtbauh
    118
iwtbauh  
   2019-01-17 18:27:48 +08:00 via Android
“说用 sudo 能够拯救我的,放弃吧。你们更新环境参数 /配置的时候,也会加上 sudo 的吧,只要加了 sudo 提权,后面的都无解吧。你每次运行 source .bashrc 肯定前面会加上 sudo 的,所以这里我还是会加上 sudo 的。”

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

同理也有

sudo echo xxx > /...

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

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

source filename
等价于
eval $( cat filename )

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

甚至直接 Ctrl+R 查找历史命令也是可以的
smilepig
    143
smilepig  
   2019-01-18 16:37:55 +08:00
能拿到硬盘的话,可以试试用软件恢复数据。。。
mygoare
    144
mygoare  
   2019-01-18 16:41:30 +08:00 via iPhone
太真实了!
maxio
    145
maxio  
   2019-01-18 16:41:40 +08:00
一开始都没有理解到为什么 source .bash_history 可以更新。
后来 get 到了,果然还是楼主聪明,这样确实可以更新一把!
ayanmw
    146
ayanmw  
   2019-01-18 16:41:40 +08:00
你居然用 source ~/.bash_history ....ni 应该怪 bash_history 为什么不加一个 # 前缀~~~
这不是 shell 脚本,只是文本,不能 source 的!!
ayanmw
    147
ayanmw  
   2019-01-18 16:44:49 +08:00
rm -rf * 其实有一个 ie ext undelete 什么软件 是可以找回来的.不过 过于专业, 且碰到 容易犯错的你,还是算了吧!
fox0001
    148
fox0001  
   2019-01-18 16:51:24 +08:00 via Android
哈哈哈,此帖必火
ml071987
    149
ml071987  
   2019-01-18 17:05:20 +08:00
大佬,跑到哪了
Ephen
    150
Ephen  
   2019-01-18 18:14:59 +08:00
这波操作 666,后续如何了?
nilai
    151
nilai  
   2019-01-18 18:21:20 +08:00
这是我看到的最好笑的笑话。。 。 不行了。 憋不住了。 又要笑了。。 哈哈哈哈。。。。 ^_^ ^_^ ^_^
hackshen
    152
hackshen  
   2019-01-19 09:47:43 +08:00
涨姿势了
shellexy
    153
shellexy  
   2019-01-19 15:33:17 +08:00
@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 就够了
shellexy
    154
shellexy  
   2019-01-19 17:00:11 +08:00 via Android
@JsonLee 咱怀疑楼主是之前是看到
“ source .bashrc 命令刷新 bash 配置”
类似的东西,
然后误以为 source 是刷新的意思,
所以误以为刷新历史纪录是
source .bash_history
shayuvpn0001
    155
shayuvpn0001  
OP
   2019-01-19 18:37:52 +08:00
@shellexy 是的,你没猜错。。。脑子秀逗了。。。
n0th1n9
    156
n0th1n9  
   2019-10-28 10:42:51 +08:00
操,我也这样了。。。
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4841 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 09:55 · PVG 17:55 · LAX 02:55 · JFK 05:55
Developed with CodeLauncher
♥ Do have faith in what you're doing.