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
()
Ответ на: комментарий от linuxnewbie

Тебе уже говорили что интерактивный интерфейс для консольных программ в 99% случаев — плохая идея?

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