LINUX.ORG.RU
Ответ на: комментарий от anonymous

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

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

Это считывает ввод в переменную в текущей сессии, не то. Представьте такую конструкцию.

wget $(read -p 'Please provide link: ' -r WGET_URL;echo $WGET_URL)
linuxnewbie
() автор топика
Ответ на: комментарий от vodz

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

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

Меня просто смутил огромный файл

 ~ # du -h /bin/head
43K     /bin/head

если трезво оценивать, то head в данном случае видимо подходит больше всего

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

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

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

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

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

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

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

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

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

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

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

Вы можете внятно объяснить, зачем для ввода вызывать другую сессию, а то и другую программу? Где вы такое видели?

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

Вы можете внятно объяснить

Да забей, это явно какая то бесполезная «хотелка».

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

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

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

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

Чушь какая.

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

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

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

Чушь какая.

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

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

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

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

видимо у вас мало опыта написания кода на шелле

Вот это «финт ушами»!

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

Не говорили. У меня там конструкция вида while true;do wget;done для обеспечения комфортной жизни пользователя (меня, а потому проверки не нужны).

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

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

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

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

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

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

Зачем?

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

echo $(read;head -1)

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

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

чего-то не работает, да?

 ~ $ echo -en '1\nurl\n3\n' |  wget read; read

Не нужно думать, что мне нужно что-то другое – мне нужно именно то, о чём я говорю в ОП.

linuxnewbie
() автор топика
Ответ на: и даже так не работает от 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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.