Использование интерактивной опции cp для сохранения текста из стандартного ввода

Попробуйте этот :тип apt show -a vlc | grep ^Version. Вы получите две вещи:

  1. Предупреждение о том, что не существует «стабильного интерфейса командной строки», что, как я полагаю, означает, что будущие версии apt могут работать иначе, чем текущие версии (, если я ошибаюсь, кто-нибудь оставьте комментарий ). Вы должны помнить об этом.

  2. Он покажет вам все версии, которые вы можете установить. Предполагая, что 2.2.0 присутствует, вы сможете запуститьsudo apt install vlc=2.2.0-something(заменить «что-то» на то, что говорит apt ), и ваш компьютер понизится. После этого вы можете пометить vlc как «удерживаемый» пакет, чтобы предотвратить его обновление в будущем. Вы можете сделать это с помощью apt-mark hold vlc.

Если у вас возникнут какие-либо проблемы с зависимостями пакетов, запуск sudo aptitudeпредоставит вам интерактивную программу, которая поможет решить эти проблемы. Возможно, вам придется установить aptitude с sudo apt install aptitude.

Если версии 2.2.0 нет, вы не сможете установить vlc из apt (при использовании графического интерфейса, указанный графический интерфейс, вероятно, использует apt в качестве серверной части ). К счастью, есть и другие способы его установки. Как указал пользователь GAD3R, вы можете скомпилировать из исходного кода, используя шаги (и ), которые он уже указал. Или вы можете установить vlc с помощью snap или flatpak, но я считаю, что обе системы упаковки немного раздуты.

Вы также можете установить образ приложения на свой компьютер. Это так же просто, как A )загрузить файл, B )сделать его исполняемым )и C )запустить его. После быстрого поиска в Интернете мне удалось найти два образа приложения:2.2.8 и 3.0.0 . *СЛЕДУЕТ *безопасно устанавливать обе одновременно, чтобы вы могли видеть, какие из них работают, а какие нет. На всякий случай вам, вероятно, следует сначала установить 2.2.8, а затем попробовать 3.0.0, так как они могут иметь несовместимые настройки. К сожалению, оба изображения являются образами amd64, поэтому вы не сможете использовать их в 32-битной --битной ОС.

0
07.04.2020, 02:43
2 ответа

Использовать другой файловый дескриптор вместо/dev/stdin

echo Hello | { cp -i /dev/fd/5 test.txt 5<&0 </dev/tty; }

Или, по-прежнему можно заскриптовать через yes (1)

{ echo Hello | { cp -i /dev/fd/5 test.txt 5<&0 <&4; }; } 4<&0

В обоих вариантах дополнительные {... }вокруг cp -i...нужны только в zsh, чтобы обойти его нестандартную -функцию multios .

Это должно работать в любой стандартной оболочке и любой системе, поддерживающей файлы /dev/fd/N, за исключением комбинации Linux + ksh93, которая не будет работать, потому что ksh93 реализует каналы с сокетами Unix, которые в Linux нельзя открыть через/dev/fd/N(даже echo | cat /dev/stdinне сработает ).

Ваш echo -n "Hello" | cp -i /dev/stdin test.txtна самом деле будет затирать файл, если вместо "Hello"вы поместите туда "You suck!". Это одна из причин, по которой вам не следует полагаться на cp -i.

0
28.04.2021, 23:18

Оболочки типа bashуже могут защищать от перезаписи файлов с перенаправлением

set -o noclobber
echo hello >world
echo hello >world
-bash: world: cannot overwrite existing file

Если вы хотите иметь возможность запрашивать пользователя перед перезаписью, я бы использовал что-то вроде этого вместо настройки noclobber

#!/bin/bash

# Define function sureYN  [<prompt>]  <target>
sureYN() {
    local prompt="$1" target="$2" yn='y'
    [[ -z "$target" ]] && { target="$prompt"; prompt="Overwrite $target"; }

    [[ -f "$target" && -t 0 ]] && read -p "$prompt (y/n)? " yn >&2
    [[ "$yn" =~ ^[Yy] ]]
}

sureYN /tmp/first && cp -fp /etc/hosts /tmp/first
sureYN "Can I replace /tmp/second" /tmp/second && echo this is the second >/tmp/second
0
28.04.2021, 23:18

Теги

Похожие вопросы