LINUX.ORG.RU

История изменений

Исправление 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.