私が望むもの
簡略化されたコマンド: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
inode番号はファイルシステムごとに一意であるため、これはより正確であるため、inode番号に加えてデバイス番号も確認する必要があります。
ここでは、末尾の改行文字を引いたコマンドの出力全体がコマンドに引数として渡されます。コマンドの置き換えこの場合、引用符なしでは意味がありませんが、行く方法です。
find / -inum "$(ls -id init.vim | awk '{print $1; exit}')"
いいえ-l
、しかしディレクトリタイプの場合は問題を避ける必要があります-d
。init.vim
また参照してください。;exit
したがって、最初のフィールドのみを印刷します。最初の行ファイル名に改行文字が含まれている場合を処理します。
あるいは、より良い方法は、まずinode番号を取得できることを確認することです。
そして
#! /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"
(ここではリストコンテキストにはなく、スカラー変数の割り当てなので、分割+globは発生しません。引用符なしでそのままにしておくことをお勧めします。)
入力ストリームをパラメータリストに変換する一般的なコマンドは、コマンドxargs
(クロスパラメータ)です。
ls -id init.vim | awk '{print $1; exit}' |
xargs -I @INODE@ find / -inum @INODE@
xargs
引数を構成するために入力を分割する(独自の方法で、いくつかの参照形式を理解する)ことは注目に値します。を使用すると、-I
分割がない場合とは異なります。詳細については、システムのマニュアルページを参照してください。POSIX仕様あなたが期待する携帯性。この場合12345<newline>
の出力はパラメータawk
に分割されます12345
。