LINUX.ORG.RU
ФорумTalks

команда без пробелов. винда может, а линуксу слабо?


0

4

в винде работающую команду с дополнительными параметрами можно записать без пробелов и кавычек, например так: more%programfiles:~10,1%c:\Windows\system.ini где создаётся переменная из строки «Program Files», откуда вырезается пробел, который используется в качестве разделителя команды и её параметра

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

Перемещено tazhate из development

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

ЕМНИП эту возможность, т.е. использование IFS для разбора командной строки выпилили еще в SysV как небезопасную.

таки твоя память та ещё шлюшка

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

Возможно. Выдел у Робачевского «Справочник по мобильным операционным системам»: «переменная IFS больше не используется для разбора командной строки». Пруф привести не смогу, не вижу этой книги в нете.

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

свежескачанный дебиан не одобряет твоих слов

lornikos
() автор топика
Ответ на: комментарий от at
/usr/lib/portage/bin/ebuild.sh:	local shopts=$(shopt) OLDIFS="$IFS"
/usr/lib/portage/bin/ebuild.sh:	[[ "$IFS" != "$OLDIFS" ]] &&
/usr/lib/portage/bin/ebuild.sh:		eqawarn "QA Notice: Global IFS changed and was not restored while sourcing '$*'"
/usr/lib/portage/bin/ebuild.sh:	local shopts=$(shopt) OLDIFS="$IFS"
/usr/lib/portage/bin/ebuild.sh:	[[ "$IFS" != "$OLDIFS" ]] &&
/usr/lib/portage/bin/ebuild.sh:		eqawarn "QA Notice: Global IFS changed and was not restored while calling '$*'"
/usr/lib/portage/bin/ebuild.sh:		save_IFS
/usr/lib/portage/bin/ebuild.sh:		IFS=$'\n'
/usr/lib/portage/bin/ebuild.sh:		restore_IFS
/usr/lib/portage/bin/isolated-functions.sh:alias save_IFS='[ "${IFS:-unset}" != "unset" ] && old_IFS="${IFS}"'
/usr/lib/portage/bin/isolated-functions.sh:alias restore_IFS='if [ "${old_IFS:-unset}" != "unset" ]; then IFS="${old_IFS}"; unset old_IFS; else unset IFS; fi'
/usr/lib/portage/bin/misc-functions.sh:		scanelf -qyRF '%a;%p;%S;%r;%n' "${D}" | { while IFS= read -r l; do
/usr/lib/portage/bin/misc-functions.sh:		local oldIFS=${IFS}
/usr/lib/portage/bin/misc-functions.sh:		IFS=$'\r'$'\n'$'\t'" "
/usr/lib/portage/bin/misc-functions.sh:		IFS=${oldIFS}
/usr/lib/portage/bin/phase-functions.sh:		HISTFILE HOSTNAME HOSTTYPE IFS LINENO MACHTYPE OLDPWD
/usr/lib/portage/bin/phase-functions.sh:	IFS=$' \t\n\r'
/usr/lib/portage/bin/phase-helpers.sh:	local IFS=$' \t\n' prev_shopts=$- ret
megabaks ★★★★
()

Твоя проблема, lornikos, в том, что ты выдумываешь велосипеды и костыли, не осилив решить проблему. Не запускается команда с пробелами? Так это не из-за пробелов, а потому что в execlp ты передаёшь команду целиком первым параметром. Система ищет бинарник с названием 'more c:\Windows\system.ini' и не находит, потому что его нет. Зато есть бинарник more.

Правильно использовать execlp так:

int res = execlp("more", "c:\\Windows\\system.ini");
Это настолько типичная ошибка, что она даже во многих FAQ описана.

i-rinat ★★★★★
()
Ответ на: комментарий от lornikos

берём значение переменной, вырезаем оттуда один символ который идёт десятым по порядку, из полученного символа делаем переменную и используем в команде more%programfiles:~10,1%c:\windows\system32\drivers\etc\hosts таким образом команда выполнится

Хорошая страшилка на ночь получается. А есть еще более убогие способы?

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

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

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

Насколько помню раньше можно было сделать так

IFS=' %' ls%/
Т.е. пробелы и % разделяют параметры. Это и выпилили.

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

Я не говорил, что переменную выпилили. Ей ограничили область применения. См. мой предыдущий комент.

at ★★
()

Очередной поклонник vi и прочих экономщиков трафика на 300бод ?

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

Ага больше бы таких приводящих свои строчки cmd и кричащих вон как я могу, а вы хрень господня :)

странно слышать на линуксхакерском форуме вопросы «зачем» в отношении странных задач. Странные задачи - это круто, весело, классно! А баш вообще может всё, если бы Мухаммед жил в наши дни, он говорил бы на баше

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

Ты так и не сказал, зачем это вообще понадобилось — избавляться от пробелов. У меня такого не было никогда, у других тоже, только у тебя. Чувствуешь, к чему всё идёт?

Хватит уже выпендриваться, прочитай документацию и заканчивай устраивать цирк. Ну или продемонстрируй объективную необходимость в описанном тобой костыле. Приведи ясный пример, когда без этого костыля — никак.

i-rinat ★★★★★
()

где создаётся переменная из строки «Program Files», откуда вырезается пробел, который используется в качестве разделителя команды и её параметра

Хорошая, годная трава.

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

+1 вот что такое настоящий настрой линуксоида! многие тут погрязли в своих повседневных задротолинуксовых мыслях, их душа уже мертва. а стив - гений, ты даже мёртвый - живее всех живых. респект!

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

многие тут погрязли в своих повседневных задротолинуксовых мыслях

вот зачем ты на ноль поделил?

megabaks ★★★★
()

Я думал что все люди хотят писать хороший читаемый код ( и не только код). Оказывается есть извращенцы, которые делают наоборот.

VadimAlexeev
()

А ещё в линуксе нельзя команду длиннее 2Гб выполнить в bash'е. Это ужасно, давайте срочно это исправлять!

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

когда встретится случай - придётся думать

lornikos
() автор топика
Ответ на: комментарий от i-rinat

Вот мне тоже кажется, что ТС набыдлокодил какую-то программулинку и теперь ищет костыли и подпорки для того, чтобы она заработала. Я там выше просил его показать программу, которой нужно передавать аргументы с такими извращениями, но вопрос был проигнорирован(а сейчас коммент уже потёрли, так как в сообщении, на которое я отвечал был мат).

shell-script ★★★★★
()
Ответ на: комментарий от Zodd

Требуем примера: для чего это может понадобиться

Когда запостить на ЛОР очень хочется, а мозгов придумать нормальную тему нет, то можно запостить сабж.

redgremlin ★★★★★
()

А не упоролись ли вы, сударь?

X=$'\x20';less${X}/etc/hosts
Deleted
()

И кстати, говнокоманда из первого поста не сработает, если переменная окружения %PROGRAMFILES% будет иметь значение отличное от ожидаемого автором темы.

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

И да, bash тоже умеет вырезать куски из переменных.

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

1. Убить быдлокодера, который написал это программное средство

2. Сделать всё по-нормальному

3. ???

4. PROFIT

KivApple ★★★★★
()

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

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

ЕМНИП в своей теме отвечать может.

at ★★
()

А зачем? Что не выполнится? Ты по-человечески объяснить можешь, зачем такое?

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

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

der_looser ★★
()

Нахрена это надо? Синтаксис еще никто не отменял. А в cmd синтаксис уродский сам по себе.

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

экранировать, не?

задача любым способом любым стандартным по и любыми доступными интерпретаторами записать команду без пробелов и кавычек

так ты определись, задача сделать чтобы работало или избежать спецсимволов? если чтобы работало, есть куча способов, а избежать спецсимволов - выдрачивайся как хочешь, кроме тебя это никому не интересно

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

А ещё в линуксе нельзя команду длиннее 2Гб выполнить в bash'е.

Это уже исправлено в zsh, я только что про

zolden ★★★★★
()

more%programfiles:~10,1%c:\Windows\system.ini

Что я только что прочитал? Особая магия?

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

Это был стеб(для групых) вообщето. В реальности такая задача на виндоуз решается установкой цигвина и баша. Ну либо использованием VBS. То что есть даже в повер шеле назвать юзабельным инструментом просто язык не поворачивается.

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

да тут никто не шарит, только языком треплют

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

Ты еврей?

Представь, что ты пришёл на олимпиаду, тебе дали задание и условия, и всем пофигу, думаешь ли ты что это православно или нет.

Не можешь решить? Слабак.

Можешь? Молодец.

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

Представь, что ты пришёл на олимпиаду, тебе дали задание и условия, и всем пофигу, думаешь ли ты что это православно или нет.

Представь, что ты пришёл на олимпиаду и тебе дали задание: написать ОС реального времени для OpenSPARC T2, без доступа к железу, и не используя готовый тулчейн. Можно писать только бинарный код. Ввод данных в машину — с перфоленты. Отверстия в ленте можно делать только ржавым тупым ножом без ручки. Тебя запирают в комнате до окончания работ.

Не можешь решить? Слабак.

Можешь? Молодец.

i-rinat ★★★★★
()
Ответ на: комментарий от Jetty

То что есть даже в повер шеле назвать юзабельным инструментом просто язык не поворачивается.

А что он не умеет?

TGZ ★★★★
()

Не совсем понятно зачем такой странный прием и как быть если `set programfiles' выдаст например `ProgramFiles=D:\Progs' ? наверное:

Синтаксическая ошибка в имени файла, имени папки или метке тома.

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

а ты типа организатор олимпиады? ну тогда извиняй, похоже, никто участвовать не возжелал

и ты таки определись, для дела тебе или в специальной олимпиаде участвуешь

xsektorx ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.