> [!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番目に選択したファイルのパス |