linux下文件名特殊符号导致的一个诡异问题
写了个bash脚本递归循环遍历文件夹。本地测试的好好的,结果传到服务器上就不行,一直死循环。以为是linux的版本问题,折腾了半天,才发现只有遍历特定那个文件夹的时候才会出现问题。
最后发现竟然有个文件夹的名字叫 \
当遍历到\文件夹的时候,路径就成为 /home/image/\
而\符号在bash里是转义符号,必须用/home/image/\\才行, /home/image/\表示的还是 /home/image/。所以导致死循环了。
然后又实验了一下,linux下的文件夹没有限制字符,所有的可打印字符都可以作文件夹名。比方 *,\,|,<,>等在windows下是不允许做文件夹名的,但linux下就可以。但这样的文件名确实会给用户造成迷惑。比方一个叫 *的文件夹,用户如果删除的时候忘记转义,输出成 rm -rf *,那就惨了。
不知道linux的设计者为什么没考虑到这个问题?或者说考虑到了,但觉得这样的问题应该让用户自己掌控?
Related Posts
OpenSuse 11.2 正式发布
Avidemux简易教程
linux下的几款绘图(Flowchart,UML)软件
Linux通过socks连接ssh服务器
mysqldump导出数据到mssql
Shell(Bash)学习笔记(一)
Javascript对象中使用setTimeout和setInterval的问题
前两天写一个js时遇到个问题。就是在js对象内部如果用setTimeout或者setInterval调用该对象的一个方法,然后在被调用方法中就无法使用this获取该对象。因为经过setTimeout调用后,this就成了浏览器了,原来那个对象就丢失了。
如:
function TestObj(){
this.property = "test";
this.called = function(){
alert(this.property);
}
this.setTimeCall = function(){
setTimeout(this.called,500);
}
}
var test = new TestObj();
test.setTimeCall();
如果直接调用test.called方法是没有问题的。但如果通过setTimeout调用,也就是调用 test.setTimeCall(),this.property就为空了。因为这里的this成浏览器了。同样的问题也发生在监听浏览器的其他事件 上。没办法,于是用了个比较糟糕的办法。
function TestObj(){
this.property = "test";
this.called = function(){
alert(this.property);
}
this.setTimeCall = function(){
setTimeout("test.called()",500);
}
}
var test = new TestObj();
test.setTimeCall();
之所以说这样做糟糕,是因为在定义TestObj时,就必须提前知道TestObj被创建时的变量名。后来在IBM社区看到一篇探讨javascript有限状态机的文章,用了一个很巧妙的办法避免这个问题。
function TestObj(){
this.property = "test";
var self = this;
this.called = function(){
alert(self.property);
}
this.setTimeCall = function(){
setTimeout(self.called,500);
}
}
var test = new TestObj();
test.called();
test.setTimeCall();
在TestObj中定义一个变量,self,然后指向this。这样用self调用this,就不会发生和浏览器的this对象冲突的问题了。
虽然是很简单的一个问题,但有时候人脑子转不过弯也没办法。
还有一个网友评论提供的办法就是:
function TestObj(){
this.called = function(){
alert("OK");
}
this.setTimeCall = function(){
setTimeout(this.called.bind(this),500);
}
}
Related Posts
微软对google说:不要把手伸到我媳妇怀里
终于在网上建了个家
javascript库的延迟加载
Javascript(Ajax)开发测试工具
css强制换行问题
javascript获取网页元素的最终样式