我想要的是
简化的命令:echo "helloworld" | echo $1
- 我知道,这可以使用
cat
,但是如果像这样的命令echo
不将文件作为输入怎么办?
我的实际命令:ls -li init.vim | cut -d " " -f 1 | find / -inum $1
- 我知道它不能
$1
像那样工作,这只是一个示例,并且$1
只是一个占位符。
命令替换:find / -inum $(ls -li init.vim | cut -d " " -f 1)
- 这工作正常,但我不希望它与命令替换。
问题
- 这可以在没有任何东西的情况下工作吗解决方法或者命令替换?
- 如果没有的话,最好的方法是什么?
感谢您的帮助 :)
答案1
在这里,通过多种find
实现,您可以这样做:
find / -samefile init.vim
这也更正确,因为索引节点号对于每个文件系统来说都是唯一的,因此除了索引节点号之外,您还需要检查设备号。
在这里,命令的整个输出减去尾随换行符,它将作为一个参数传递给命令,命令替换是要走的路,尽管在这种情况下不加引号是没有意义的:
find / -inum "$(ls -id init.vim | awk '{print $1; exit}')"
不需要-l
,但如果是目录类型,我们需要-d
避免出现问题。init.vim
另请参阅,;exit
因此我们只打印第一个字段第一行的处理文件名包含换行符的情况。
或者更好的是,首先检查您是否能够获取索引节点号
和
#! /bin/sh -
file=init.vim
inode=$(
set -o pipefail # also care about ls exit status below
ls -id -- "$file" | awk '{print $1; exit}'
) || exit
find / -inode "$inode"
(在这里,最好将其不加引号,因为我们不在列表上下文中,因为这是标量变量赋值,因此不会发生 split+glob)。
将输入流转换为参数列表的通用命令是命令xargs
(交叉参数):
ls -id init.vim | awk '{print $1; exit}' |
xargs -I @INODE@ find / -inum @INODE@
值得注意的是,xargs
它将分割输入(以它自己的方式,它确实理解某种形式的引用)来组成参数(并且使用-I
,分割的完成方式与不使用不同),请参阅系统上的手册页细节和POSIX 规范满足您所期待的便携性。在这种情况下,12345<newline>
的输出awk
将被拆分为一个12345
参数。