История изменений
Исправление theNamelessOne, (текущая версия) :
Мне кажется, что проблема тут скорее в баше, а не в юниксе как таковом.
Эту задачу решить довольно просто, если писать на нормальном шелле, а не на говне мамонта типа bash и прочих POSIX-совместимых шеллах (я правда не нашёл, как получить список GUI-окон в общем случае, так что делал для своего WM). Получилось вполне читаемо, ИМХО:
#!/usr/bin/env nu
def niri-windows [] {
niri msg --json windows | from json | get pid
}
# Displays total amount of memory used by GUI programs.
export def main [
--mem-type (-t): string = "physical" # One of: phys, physical, virt, virtual
]: nothing -> filesize {
let mem_col = match $mem_type {
"phys" => "mem"
"physical" => "mem"
"virt" => "virtual"
"virtual" => "virtual"
_ => {
error make {
msg: "Invalid memory type"
label: {
text: "Must be one of: phys, physical, virt, virtual"
span: (metadata $mem_type).span
}
}
}
}
let windows = niri-windows
ps
| select pid $mem_col
| where pid in $windows
| get $mem_col
| math sum
}
Из коробки плюшки типа автодокументации команд, парсинга и типизации аргументов, красивых ошибок (ЛОР правда немного похерил вывод), а самое главное — нет башевских особенностей, которые мы все так нежно любим:
$ /tmp/gui-mem-classic-ng-reloaded -h
Displays total amount of memory used by GUI programs.
Usage:
> gui-mem-classic-ng-reloaded {flags}
Flags:
-t, --mem-type <string>: One of: phys, physical, virt, virtual (default: 'physical')
-h, --help: Display the help message for this command
Input/output types:
╭───┬─────────┬──────────╮
│ # │ input │ output │
├───┼─────────┼──────────┤
│ 0 │ nothing │ filesize │
╰───┴─────────┴──────────╯
$ /tmp/gui-mem-classic-ng-reloaded
1.9 GiB
$ /tmp/gui-mem-classic-ng-reloaded -t virt
21.3 GiB
$ /tmp/gui-mem-classic-ng-reloaded -t invalid
Error:
× Invalid memory type
╭─[<commandline>:1:6]
1 │ main -t invalid
· ─────┬────
· ╰── Must be one of: phys, physical, virt, virtual
╰────
Сделать разбивку по воркспейсам тоже не особо сложно будет, правда для этого опять придётся дёргать API моего WM.
Исправление theNamelessOne, :
Мне кажется, что проблема тут скорее в баше, а не в юниксе как таковом.
Эту задачу решить довольно просто, если писать на нормальном шелле, а не на говне мамонта типа bash и прочих POSIX-совместимых шеллах (я правда не нашёл, как получить список GUI-окон в общем случае, так что делал для для своего WM). Получилось вполне читаемо, ИМХО:
#!/usr/bin/env nu
def niri-windows [] {
niri msg --json windows | from json | get pid
}
# Displays total amount of memory used by GUI programs.
export def main [
--mem-type (-t): string = "physical" # One of: phys, physical, virt, virtual
]: nothing -> filesize {
let mem_col = match $mem_type {
"phys" => "mem"
"physical" => "mem"
"virt" => "virtual"
"virtual" => "virtual"
_ => {
error make {
msg: "Invalid memory type"
label: {
text: "Must be one of: phys, physical, virt, virtual"
span: (metadata $mem_type).span
}
}
}
}
let windows = niri-windows
ps
| select pid $mem_col
| where pid in $windows
| get $mem_col
| math sum
}
Из коробки плюшки типа автодокументации команд, парсинга и типизации аргументов, красивых ошибок (ЛОР правда немного похерил вывод), а самое главное — нет башевских особенностей, которые мы все так нежно любим:
$ /tmp/gui-mem-classic-ng-reloaded -h
Displays total amount of memory used by GUI programs.
Usage:
> gui-mem-classic-ng-reloaded {flags}
Flags:
-t, --mem-type <string>: One of: phys, physical, virt, virtual (default: 'physical')
-h, --help: Display the help message for this command
Input/output types:
╭───┬─────────┬──────────╮
│ # │ input │ output │
├───┼─────────┼──────────┤
│ 0 │ nothing │ filesize │
╰───┴─────────┴──────────╯
$ /tmp/gui-mem-classic-ng-reloaded
1.9 GiB
$ /tmp/gui-mem-classic-ng-reloaded -t virt
21.3 GiB
$ /tmp/gui-mem-classic-ng-reloaded -t invalid
Error:
× Invalid memory type
╭─[<commandline>:1:6]
1 │ main -t invalid
· ─────┬────
· ╰── Must be one of: phys, physical, virt, virtual
╰────
Сделать разбивку по воркспейсам тоже не особо сложно будет, правда для этого опять придётся дёргать API моего WM.
Исправление theNamelessOne, :
Мне кажется, что проблема тут скорее в баше, а не в юниксе как таковом.
Эту задачу решить довольно просто, если писать на нормально шелле, а не на говне мамонта типа bash и прочих POSIX-совместимых шеллах (я правда не нашёл, как получить список GUI-окон в общем случае, так что делал для для своего WM). Получилось вполне читаемо, ИМХО:
#!/usr/bin/env nu
def niri-windows [] {
niri msg --json windows | from json | get pid
}
# Displays total amount of memory used by GUI programs.
export def main [
--mem-type (-t): string = "physical" # One of: phys, physical, virt, virtual
]: nothing -> filesize {
let mem_col = match $mem_type {
"phys" => "mem"
"physical" => "mem"
"virt" => "virtual"
"virtual" => "virtual"
_ => {
error make {
msg: "Invalid memory type"
label: {
text: "Must be one of: phys, physical, virt, virtual"
span: (metadata $mem_type).span
}
}
}
}
let windows = niri-windows
ps
| select pid $mem_col
| where pid in $windows
| get $mem_col
| math sum
}
Из коробки плюшки типа автодокументации команд, парсинга и типизации аргументов, красивых ошибок (ЛОР правда немного похерил вывод), а самое главное — нет башевских особенностей, которые мы все так нежно любим:
$ /tmp/gui-mem-classic-ng-reloaded -h
Displays total amount of memory used by GUI programs.
Usage:
> gui-mem-classic-ng-reloaded {flags}
Flags:
-t, --mem-type <string>: One of: phys, physical, virt, virtual (default: 'physical')
-h, --help: Display the help message for this command
Input/output types:
╭───┬─────────┬──────────╮
│ # │ input │ output │
├───┼─────────┼──────────┤
│ 0 │ nothing │ filesize │
╰───┴─────────┴──────────╯
$ /tmp/gui-mem-classic-ng-reloaded
1.9 GiB
$ /tmp/gui-mem-classic-ng-reloaded -t virt
21.3 GiB
$ /tmp/gui-mem-classic-ng-reloaded -t invalid
Error:
× Invalid memory type
╭─[<commandline>:1:6]
1 │ main -t invalid
· ─────┬────
· ╰── Must be one of: phys, physical, virt, virtual
╰────
Сделать разбивку по воркспейсам тоже не особо сложно будет, правда для этого опять придётся дёргать API моего WM.
Исходная версия theNamelessOne, :
Мне кажется, что проблема тут скорее в баше, а не в юниксе как таковом.
Эту задачу решить довольно просто, если писать на нормально шелле, а не на говне мамонта типа bash и прочих POSIX-совместимых шеллах (я правда не нашёл, как получить список GUI-окон в общем случае, так что делал для для своего WM). Получилось вполне читаемо, ИМХО:
#!/usr/bin/env nu
def niri-windows [] {
niri msg --json windows | from json | get pid
}
# Displays total amount of memory used by GUI programs.
export def main [
--mem-type (-t): string = "physical" # One of: phys, physical, virt, virtual
]: nothing -> filesize {
let mem_col = match $mem_type {
"phys" => "mem"
"physical" => "mem"
"virt" => "virtual"
"virtual" => "virtual"
_ => {
error make {
msg: "Invalid memory type"
label: {
text: "Must be one of: phys, physical, virt, virtual"
span: (metadata $mem_type).span
}
}
}
}
let windows = niri-windows
ps
| select pid $mem_col
| where pid in $windows
| get $mem_col
| math sum
}
Из коробки плюшки типа автодокументации команд, парсинга и типизации аргументов, красивых ошибок (ЛОР правда немного похерил вывод), а самое главное — нет башевских особенностей, которые мы все так нежно любим:
$ /tmp/gui-mem-classic-ng-reloaded -h
Displays total amount of memory used by GUI programs.
Usage:
> gui-mem-classic-ng-reloaded {flags}
Flags:
-t, --mem-type <string>: One of: phys, physical, virt, virtual (default: 'physical')
-h, --help: Display the help message for this command
Input/output types:
╭───┬─────────┬──────────╮
│ # │ input │ output │
├───┼─────────┼──────────┤
│ 0 │ nothing │ filesize │
╰───┴─────────┴──────────╯
$ /tmp/gui-mem-classic-ng-reloaded
1.9 GiB
$ /tmp/gui-mem-classic-ng-reloaded -t virt
21.3 GiB
$ /tmp/gui-mem-classic-ng-reloaded -t invalid
Error:
× Invalid memory type
╭─[<commandline>:1:6]
1 │ main -t invalid
· ─────┬────
· ╰── Must be one of: phys, physical, virt, virtual
╰────
Сделать по воркспейсам тоже не особо сложно будет, правда для этого опять придётся дёргать API моего WM.