LINUX.ORG.RU

Ответ на: комментарий от anonymous

Это внешняя команда? Как вариант. А с другой стороны, видимо, read не заменить — он среди прочего позволяет показать приглашение, это минус одна строка. Я просто сейчас думаю что без приглашения будет не очевидно чего ждём.

linuxnewbie ()
Ответ на: комментарий от Deleted

Сессия засирается мусорными переменными, но в принципе это мне уже приходило на ум. Должно быть даже лучше, поскольку не дёргаются процессы. Но вопрос не об этом, можно ли сделать это встроенными средствами шелла? Потому что head -1 вполне себе вариант.

linuxnewbie ()
Ответ на: комментарий от linuxnewbie

Команда выполняется в сабшелле, в совершенно другой сессии, и считывает в никуда. Чтобы получить её результат, нужно его вывести.

Ещё раз. Команда $(read v; echo $v) делает следующее: считывает ввод в переменную и вызывает команду, из ввода. Результат аналогичен тому же как и без echo, что совершенно понятно. Как аргумент у команды эта конструкция совершенно бессмысленна, так как именно из-за тупой экономии в одну строку вы вызываете сабшел, а потом думаете как из него получить результат.

vodz ★★★★★ ()
Ответ на: комментарий от linuxnewbie

Внешняя. Это принципиально? Если что, она в POSIX входит, так что обязана везде быть. Или дело в миллисекундах (и то в теории, на практике там микро наверное) сэкономленных?

anonymous ()
Ответ на: комментарий от linuxnewbie

Вроде первый. Что получить ввод, в данном случае от пользователя, логично?

А может просто повнимательнее читать ответы надо? Перечитайте еще раз коменты zvezdochiot, у него открытым текстом спрашивается.

На всякий случай, вот из моего сегодняшнего: ftp://ftp.simtreas.ru/pub/my/jq1.sh Почитайте, может чего и пригодится.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от anonymous

Если дело в них — пиши уж сразу на компилируемом языке — больше сэкономишь.

Результат обычно бывает у таких — хужее. Ну скрипт то худо-бедно будет работать и чего с его взять, подумаешь fork на пользовательский ввод... (пока так и не дождались ответа — зачем), но ведь сделает же...

vodz ★★★★★ ()
Ответ на: комментарий от linuxnewbie

Чтобы получить ввод и не засорять при этом память переменными, которые не понадобятся больше никогда?

Смешно же. Во-первых у read встроенная переменная $REPLY, если не указана явно (в том URL это и юзается), во-вторых, вы в самом деле считаете, что fork - это будет лучше? :-O

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Как может быть хуже, если работает и выполняет ещё меньше бесполезных операций? Однако мне кажется странным делать на компилируемом языке что-то, только чтобы потом дёргать system(). Тем более что таким же образом можно положить любые команды в файл и вызывать уже его. И это опять выход за пределы сессии шелла.

linuxnewbie ()
Ответ на: комментарий от vodz

В 99% скриптов, и там нет иного варианта. Только чтобы не засорять текущую интерактивную сессию переменными. Да и потом, на случай, если враги будут сканировать память, тоже.

linuxnewbie ()
Ответ на: комментарий от linuxnewbie

В 99% скриптов, и там нет иного варианта.

Чушь какая.

Да и потом, на случай, если враги будут сканировать память, тоже.

Да ваш ввод в памяти интерпретатора будет в 10 местах, в буфере пайпа, в буфере стека интерпретатора, в буфере аргументов для вызова wget и еще чер-те где.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Чушь какая.

видимо у вас мало опыта написания кода на шелле, особенно сложной логики

будет в 10 местах, в буфере пайпа, в буфере стека интерпретатора, в буфере аргументов

а спустя 10 часов?

linuxnewbie ()
Ответ на: комментарий от linuxnewbie

а спустя 10 часов?

Переменные вы можете очистить/переиспользовать. Внутренности интерпретатора очистить вы не можете.

видимо у вас мало опыта написания кода на шелле, особенно сложной логики

О, попёр типичный дет сад «сам дурак». Да вы столь на свете не живёте, сколько мне приходилось писать...

vodz ★★★★★ ()
Ответ на: комментарий от linuxnewbie

43 КБ — огромный? Ты на чём запускаешь? Если какая-то лютая эмбедщина — там уже busybox и для шелла и для wget и для head, один на всех, загруженный целиком. Если на чём-то хотя бы уровня rPi, то что тебе эти 43 КБ? А если уж хочется экономить на спичках — это уже не на баше надо писать, а на C, и компилять. Тогда и wget не понадобит со всеми своими фичами, только простая либа для получения нужного файла.

В общем, опиши, в чём именно задача — в плане, что именно экономить надо: время, память, всё вместе? И главное, зачем. От этого может зависеть целесообразность того или иного решения.

anonymous ()
Ответ на: комментарий от vodz

столь на свете не живёте, сколько мне

Ну-ну, очередные опрометчивые заявления. Мы перевалили за 30 сообщений и до сих пор в теме есть единственный адекватный ответ за авторством глубокоуважаемого анонима.

linuxnewbie ()
Ответ на: комментарий от linuxnewbie

Предыдущее сообщение от анонима было результатом выяснения от предыдущих коментов в чём у вас вывих сознания. А первый разумный ответ был пятым.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от anonymous

Мне нужно, чтобы это работало локально, работало на nas с freebsd, работало на роутере с openwrt (к нему тоже подключён сторейдж для доступа из интернет), работало на порезанном инстансе в облаке, работало на других произвольных пк (для чего мне предпочтителен однострочник), в общем везде, где нужно что-нибудь скачать (уже были прецеденты).

Если head действительно будет везде, я наверное могу с ним смириться. Просто многие системы очень порезанные, у меня постоянно проблемы из-за этого возникают.

linuxnewbie ()
Ответ на: комментарий от linuxnewbie

Если вы про первый комент, то это трюк, как написать read без read. Такое подойдёт только для извращенного вопроса на засыпку, из серии бесполезных экзаменационных/олимпиадных вопросов. С таким же успехом еще проще было бы «wget -i -» вызывать, тут даже внешняя программа не будет вызываться.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Мне подходит, я пользуюсь уже целый день. Очень, исключительно удобно. Покрывает все мои потребности на 100%. Там не wget, а длинная команда с кучей ключей, и это именно то, о чём был вопрос.

linuxnewbie ()
Ответ на: комментарий от linuxnewbie

Очень, исключительно удобно.

Оно сразу же сломается, если потребуется читать не по строке интерактивно, а из файла/пайпа. Ибо head зажуёт тогда не одну строку, а весь входной поток целиком.

vodz ★★★★★ ()
Ответ на: комментарий от linuxnewbie

Зачем?

Ну у вас же большой скрипт?

echo $(read;head -1)

Во-первых, никакого read там вначале не было, там у вас стоит ваша «охрененно удобная конструкция» первого чтения с head, потом потребовалось прочитать дальше. А во-вторых, ну и зачем тогда head? Юзайте read и без сабшела.

vodz ★★★★★ ()
Ответ на: и даже так не работает от linuxnewbie

и даже так не работает

Именно. И с head не работает.

echo -en '1\nurl\n3\n' | script_with_head

Зато без дурацкого условия «без переменных» всё работает, даже в одну строку можно при очень большом желании написать

echo -en '1\nurl\n3\n' | { read ; echo "REPLY1=$REPLY"; read; echo "URL=$REPLY"; read; echo "REPLY3=$REPLY"; }

vodz ★★★★★ ()