V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
shayuvpn0001
V2EX  ›  程序员

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

  shayuvpn0001 · Jan 17, 2019 · 25911 views
This topic created in 2656 days ago, the information mentioned may be changed or developed.

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

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

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

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

看了一下 history。。。

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

Supplement 1  ·  Jan 17, 2019
From #22, @Liberal0
source FILENAME [arguments]:read and execute commands from FILENAME in the current shell.
Supplement 2  ·  Jan 17, 2019
我有些没理解,
为什么不是 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 * -_-!!!!


这真的是美好的一天啊!!!
Supplement 3  ·  Jan 17, 2019
rm -rf 这种敏感操作,我还是很注意的。主要是没想到 source 这个浓眉大眼的也这么凶狠。。。
Supplement 4  ·  Jan 17, 2019
说用 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 replies    2019-10-28 10:42:51 +08:00
1  2  
adminsam
    101
adminsam  
   Jan 17, 2019   ❤️ 1
“于是想到了用 source 更新一下” 你可真是个小机灵鬼呢
RobertYang
    102
RobertYang  
   Jan 17, 2019 via Android   ❤️ 1
太秀了吧,居然想用 source
nonfxck
    103
nonfxck  
   Jan 17, 2019
总翻不到自己想找的以前的命令

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

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

同理也有

sudo echo xxx > /...

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

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

source filename
等价于
eval $( cat filename )

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

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