> [!right-bubble] ![[neovim-chan-face1.webp]] > > [!caution] [[ネオ]](agent)により自動で記述された項目です。 > ## 事象 [[Yazi]]をv26.8.15へアップデートしたあと、[[設定ファイル (yazi)|keymap.toml]]に書いた自作の[[WebP]]変換コマンドが失敗するようになった。 ```toml { on = [ "<Space>", "w", "w", ], run = 'shell --block -- magick "$0" "${0%.*}.webp"', desc = "Convert an image to WebP" }, ``` ```console magick "$0" "${0%.*}.webp" Process exited with status code: 1 ``` `$0` を使っている**すべての `shell` アクション**が対象で、[[ImageMagick]]の変換に限った話ではない。7z圧縮・GIF変換なども同様に失敗する。 ### 環境 | 対象 | バージョン | | ---------- | ----------- | | [[Yazi]] | v26.8.15 | | [[macOS]] | 26.5.2 | ## 原因 `shell` アクションの**位置パラメータ `$0` / `$@` が削除された**ため。ファイルパスが渡らなくなり、`$0` は[[sh]]自身を指す `sh` という文字列になる。つまり `magick sh "sh.webp"` を実行していた。 もともとv25.12.29で `%h` / `%s` などのshell formattingが導入された際に非推奨となっていたもので、v26.8.15で実装ごと消えた。 実行部分( `yazi-scheduler/src/process/shell.rs` )を新旧で比べると分かりやすい。 ```diff Command::new("sh") .arg("-c") .arg(opt.cmd) - // TODO: remove - .args(opt.args.iter().map(|u| u.as_url().unified_path_str())) .current_dir(cwd) ``` > [!caution] CHANGELOGにこの削除は記載されていない > v26.8.15のChangedにもRemovedにも載っていないため、リリースノートの差分を読むだけでは検知できない。非推奨のまま放置している設定は、メジャーアップデートのたびに実物で動作確認するしかない。 新旧のソースは、タグを指定して[[GitHub CLI|gh]]で直接取得すると比較しやすい。 ```console gh api "repos/sxyazi/yazi/contents/yazi-scheduler/src/process/shell.rs?ref=v26.5.6" -q '.content' | base64 -d ``` ## 解決方法 `$0` を `%h` へ移行する。 ```diff - run = 'shell --block -- 7zz a "$0.7z" "$0"' + run = 'shell --block -- 7zz a "%h.7z" "%h"' ``` ただし `${0%.*}`(拡張子を除去するシェル展開)のように**シェル側のパラメータ展開と併用している場合は単純置換ができない**。先頭で変数に受けてから使う。 ```diff - run = 'shell --block -- magick "$0" "${0%.*}.webp"' + run = 'shell --block -- f=%h; magick "$f" "${f%.*}.webp"' ``` - `%h` は[[Yazi]]側でシェルエスケープ済みの文字列に展開されるため、**スペースを含むパスでも安全** - `${f%.*}` の `%` は[[Yazi]]のフォーマッタが未知のパラメータとして素通しするため、`%h` などと衝突しない - 展開処理は `yazi-fs/src/splatter.rs` の `visit_unknown` > [!info] 対応する新パラメータ > | 旧 | 新 | 意味 | > | ------ | ----- | ---------------- | > | `"$0"` | `%h` | ホバー中のファイルのパス | > | `"$@"` | `%s` | 選択中のファイルのパス(複数) | > | `"$N"` | `%sN` | N番目に選択したファイルのパス |