我想知道是否可以ls -l
通过自定义列修改命令。
例如,我希望此列包含每个文件,例如$(CustomCommand FILE)
.
答案1
这是一个非常基本的概念证明。不是特别健壮(例如带有空格的文件名会破坏它),但可以理解这个想法。
$ export CustomCommand=file
$ alias ls=/tmp/test/myls
$ ls
a b c myls
$ ls -l
-rw-rw-r-- 1 steve steve 0 Sep 22 19:17 a a: empty
-rw-rw-r-- 1 steve steve 0 Sep 22 19:17 b b: empty
-rw-rw-r-- 1 steve steve 0 Sep 22 19:17 c c: empty
-rwxr-xr-x 1 steve steve 127 Sep 22 19:18 myls myls: POSIX shell script, ASCII text executable
$ cat /tmp/test/myls
#!/bin/sh
if [ "$1" = "-l" ]
then
shift
ls -l $* | awk 'NF>2{ printf "%s ",$0 ; system("$CustomCommand " $NF) }'
else
ls $*
fi
$
答案2
这是一种将paste、sed、ls 组合在一起并将其保存到bashrc 的方法。它有两个主要部分:
- 这里的“custom_command”接受参数,但仅在传递给它的每个参数前面加上“YYY”并附加“ZZZ”,OP的实际CustomCommand当然会做一些不同的事情
- 名为“ls1”的别名,其中包括调用 custom_command。将其命名为“ls1”以避免与“ls”冲突,因为我们仍然依赖“ls”
所以在你的 ~/.bashrc 中,添加:
custom_command ()
{
for i; do
echo "YYY${i}ZZZ"
done
}
alias ls1='paste <( ls -lh | sed 1d ) <( custom_command * )'
然后. ~/.bashrc
使其在当前终端生效。
如果当前目录包含'dir1''file1''file2'和'file 3'(测试带有空格的文件),您可以运行别名ls1
并看到:
$ ls1
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1 YYYdir1ZZZ
-rw-r--r-- 1 meme meme 8 Sep 22 13:51 file1 YYYfile1ZZZ
-rw-r--r-- 1 meme meme 8 Sep 22 13:51 file2 YYYfile2ZZZ
-rw-r--r-- 1 meme meme 14 Sep 22 15:45 file 3 YYYfile 3ZZZ
解释
custom_command ()
{
for i; do
echo "YYY${i}ZZZ"
done
}
- 如果
for i
不进一步指定任何内容,将导致 for 循环使用位置参数 - 大括号是区分 i 变量所必需的,否则 bash 会将 $iZZZ 误解为变量
输出示例:
$ custom_command a b c
YYYaZZZ
YYYbZZZ
YYYcZZZ
*
与bash 扩展一起使用时:
$ custom_command *
YYYdir1ZZZ
YYYfile1ZZZ
YYYfile2ZZZ
YYYfile 3ZZZ
“ls -lh”通常会执行以下操作:
$ ls -lh
total 16K
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1
-rw-r--r-- 1 meme meme 8 Sep 22 13:51 file1
-rw-r--r-- 1 meme meme 8 Sep 22 13:51 file2
-rw-r--r-- 1 meme meme 14 Sep 22 15:45 file 3
使用sed,1表示第1行,d表示删除,删除第一行:
$ ls -lh | sed 1d
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1
-rw-r--r-- 1 meme meme 8 Sep 22 13:51 file1
-rw-r--r-- 1 meme meme 8 Sep 22 13:51 file2
-rw-r--r-- 1 meme meme 14 Sep 22 15:45 file 3
程序paste
和过程替换<(...)
是将这些原本独立的输出组合起来的关键。粘贴通常需要文件作为参数,例如paste data1 data2
.我们使用 bash 的进程替换,因此命令的输出将显示为粘贴为它可以使用的普通文件,因此:
$ paste <( ls -lh | sed 1d ) <( custom_command * )
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1 YYYdir1ZZZ
-rw-r--r-- 1 meme meme 8 Sep 22 13:51 file1 YYYfile1ZZZ
-rw-r--r-- 1 meme meme 8 Sep 22 13:51 file2 YYYfile2ZZZ
-rw-r--r-- 1 meme meme 14 Sep 22 15:45 file 3 YYYfile 3ZZZ
使用 bashrc 只是保存此命令,以便在新终端或运行. ~/.bashrc
重新加载 bash 的现有终端中方便地重复使用。