Это внешняя команда? Как вариант. А с другой стороны, видимо, read не заменить — он среди прочего позволяет показать приглашение, это минус одна строка. Я просто сейчас думаю что без приглашения будет не очевидно чего ждём.
Сессия засирается мусорными переменными, но в принципе это мне уже приходило на ум. Должно быть даже лучше, поскольку не дёргаются процессы. Но вопрос не об этом, можно ли сделать это встроенными средствами шелла? Потому что head -1 вполне себе вариант.
Команда выполняется в сабшелле, в совершенно другой сессии, и считывает в никуда. Чтобы получить её результат, нужно его вывести.
Ещё раз. Команда $(read v; echo $v) делает следующее: считывает ввод в переменную и вызывает команду, из ввода. Результат аналогичен тому же как и без echo, что совершенно понятно. Как аргумент у команды эта конструкция совершенно бессмысленна, так как именно из-за тупой экономии в одну строку вы вызываете сабшел, а потом думаете как из него получить результат.
Внешняя. Это принципиально? Если что, она в POSIX входит, так что обязана везде быть. Или дело в миллисекундах (и то в теории, на практике там микро наверное) сэкономленных?
Если дело в них — пиши уж сразу на компилируемом языке — больше сэкономишь.
Результат обычно бывает у таких — хужее. Ну скрипт то худо-бедно будет работать и чего с его взять, подумаешь fork на пользовательский ввод... (пока так и не дождались ответа — зачем), но ведь сделает же...
Чтобы получить ввод и не засорять при этом память переменными, которые не понадобятся больше никогда?
Смешно же. Во-первых у read встроенная переменная $REPLY, если не указана явно (в том URL это и юзается), во-вторых, вы в самом деле считаете, что fork - это будет лучше? :-O
Как может быть хуже, если работает и выполняет ещё меньше бесполезных операций? Однако мне кажется странным делать на компилируемом языке что-то, только чтобы потом дёргать system(). Тем более что таким же образом можно положить любые команды в файл и вызывать уже его. И это опять выход за пределы сессии шелла.
В 99% скриптов, и там нет иного варианта. Только чтобы не засорять текущую интерактивную сессию переменными. Да и потом, на случай, если враги будут сканировать память, тоже.
Да и потом, на случай, если враги будут сканировать память, тоже.
Да ваш ввод в памяти интерпретатора будет в 10 местах, в буфере пайпа, в буфере стека интерпретатора, в буфере аргументов для вызова wget и еще чер-те где.
43 КБ — огромный? Ты на чём запускаешь? Если какая-то лютая эмбедщина — там уже busybox и для шелла и для wget и для head, один на всех, загруженный целиком. Если на чём-то хотя бы уровня rPi, то что тебе эти 43 КБ? А если уж хочется экономить на спичках — это уже не на баше надо писать, а на C, и компилять. Тогда и wget не понадобит со всеми своими фичами, только простая либа для получения нужного файла.
В общем, опиши, в чём именно задача — в плане, что именно экономить надо: время, память, всё вместе? И главное, зачем. От этого может зависеть целесообразность того или иного решения.
Ну-ну, очередные опрометчивые заявления. Мы перевалили за 30 сообщений и до сих пор в теме есть единственный адекватный ответ за авторством глубокоуважаемого анонима.
Мне нужно, чтобы это работало локально, работало на nas с freebsd, работало на роутере с openwrt (к нему тоже подключён сторейдж для доступа из интернет), работало на порезанном инстансе в облаке, работало на других произвольных пк (для чего мне предпочтителен однострочник), в общем везде, где нужно что-нибудь скачать (уже были прецеденты).
Если head действительно будет везде, я наверное могу с ним смириться. Просто многие системы очень порезанные, у меня постоянно проблемы из-за этого возникают.
Если вы про первый комент, то это трюк, как написать read без read. Такое подойдёт только для извращенного вопроса на засыпку, из серии бесполезных экзаменационных/олимпиадных вопросов. С таким же успехом еще проще было бы «wget -i -» вызывать, тут даже внешняя программа не будет вызываться.
Мне подходит, я пользуюсь уже целый день. Очень, исключительно удобно. Покрывает все мои потребности на 100%. Там не wget, а длинная команда с кучей ключей, и это именно то, о чём был вопрос.
Оно сразу же сломается, если потребуется читать не по строке интерактивно, а из файла/пайпа. Ибо head зажуёт тогда не одну строку, а весь входной поток целиком.
Во-первых, никакого read там вначале не было, там у вас стоит ваша «охрененно удобная конструкция» первого чтения с head, потом потребовалось прочитать дальше. А во-вторых, ну и зачем тогда head? Юзайте read и без сабшела.