如何编写支持ls标准选项的Bash函数lf以仅列出文件?
问题分析与解决
你的问题出在**只传递了第一个参数$1**给ls,而没有把用户输入的所有参数(包括多个选项、路径)完整传进去。
当你执行lf -l时,原函数里的命令变成了ls -p "-l"——ls会把-l当作一个文件名去查找,而不是作为命令选项,自然会报错找不到这个文件,导致grep读取标准输入时出现异常。而直接执行ls -p -l时,两个都是ls的选项,所以能正常工作。
修正后的函数
把$1换成"$@",它会完整保留所有传入的参数(包括多个选项、路径参数),并以正确的格式传递给ls:
function lf(){ ls -p "$@" | grep -v / }
验证效果
- 执行
lf:等价于ls -p | grep -v /,正常列出当前目录的文件 - 执行
lf -l ~/Documents:等价于ls -p -l ~/Documents | grep -v /,以长格式列出指定目录下的文件 - 执行
lf -a -h:等价于ls -p -a -h | grep -v /,显示隐藏文件并以易读格式展示
这样就能让lf完全兼容ls的所有标准选项,使用方式和ls完全一致,同时只输出文件。
内容的提问来源于stack exchange,提问作者David Shaw
相关产品推荐
相关产品推荐

