LINUX.ORG.RU

несколько вопросов

 


0

1

1. как качать файлы с сылок вида http://www.kernel.org/pub/linux/kernel/x.x/linux-x.x[.x].tar.xz, http://.../current-stage3/stage3-amd64-xxxxxxxx.tar.bz2, чтоб всегда качалась последняя версия?

2. как из одного скрипта передать переменные во второй, в момент его запуска первым? кроме export есть варианты?

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

4. в LFS написано, что перед сборкой пакетов лучше создать чистого юзера и делать всё под ним. это делается только для того чтобы обеспечить чистый env?

5. какой командой обрезать строку, чтоб показывало только первое слово (до пробела или таба)? ziemin сказал что можно cut'ом, я прочитал man и не понял как это сделать

6. какой командой убрать первый символ?

7. как лучше грепать строку вида 'aYbcXbac Z cXbZac /dir aZac abZYc /dir cbbX', получая из неё строки вида 'Z /dir', 'X /dir', 'Y /dir', причём если в слове перед /dir есть и X и Y и Z, брать только последнюю из них, плюс если каждого по нескольку, например 'X /dir1 X /dir2', брать последний? задача в том, что есть вывод команды и надо проверять, есть ли в нём после X/Y/Z '/dir', если есть, назначить на '/dir' переменную. что для этой задачи лучше подходит, sed?

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 4)

1. Не угадаешь

2. Переменная в виде параметра

6. sed -e 's/^.//g'

minakov ★★★★★
()

4) Ещё для того, чтобы выполняя команды с правами root'a не загубить систему.

5)

cut -d' ' -f1

6)

sed 's/^.//'

hope13 ★★★
()
Последнее исправление: hope13 (всего исправлений: 2)

показывало только первое слово

$echo -e 123\\t345|cut -f1
123
$echo -e 123 345|cut -f1 -d\ 
123

В принципе после -d может быть любой разделитель. Если нужно несколько, то либо комбинируй два, три ... 100500 cut либо sed (ну или там awk, perl) с регекспами.

ziemin ★★
()

1. Качай страницу и вырезай ссылку, потом качай объект по ссылке. Однострочника с грепом и вгетом хватит.

2. ./run.sh «$ARG1» «$ARG2»

3. Логин шелл - такой, который запускается после логина по умолчанию. Интерактивный - такой, который ведет диалог с пользователем в реальном времени. Сравнение холодного с зелёным.

5. echo one two three | awk '{print $1}'

7. Перепиши на русский, желательно с адекватным примером. Ну непонятно же ничего.

schizoid ★★★
()
Последнее исправление: schizoid (всего исправлений: 2)

minakov

Переменная в виде параметра

./script-1
#!/bin/bash
./script-2 F=fff
________________
./script-2
#!/bin/bash
case $* in
*)
if [ `echo $*|wc -w` != '0' ];then $*; echo $F;fi;esac
_______________

./script-1
./script-2 line 4: F=fff: command not found

ziemin

./run.sh «$ARG1» «$ARG2»

ничего не выводит

7. Перепиши на русский, желательно с адекватным примером. Ну непонятно же ничего.

есть вывод команды
aybcxbac z cxbzac /yez azac abzyc /ggedx cbbx
и надо проверять, есть ли в нём после x/y/z '/что-то", если есть, назначить на '/что-то' переменную (например, если есть в строке z, проверяем, не начинается ли седуеще слово на /, если да, то DIRz=/tmp, затем проверяем y и x...), причём если в слове перед /что-то есть и x и y и z, брать только последнюю из xyz, плюс если каждого по нескольку, например 'x /tmp1 x /tmp2', брать последний

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

Вообще-то я про другое писал, но раз уж спросил, то передать переменные можно через аргументы.

./run.sh "$ARG1" "$ARG2"...

А во втором скрипте будет $1, $2 и т.д.

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

Качай страницу

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

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

Логин шелл - такой, который запускается после логина по умолчанию. Интерактивный - такой, который ведет диалог с пользователем в реальном времени.

честно говоря не понял. логин шелл - тот который пароль спрашивает? а потом превращается в интерактивный?

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

мне нужно передать 'VAR1=A' 'VAR2=B'

Опции замути. man getopt. Правда в основном опции из одной буквы, но я слышал некоторые реализации поддерживают типа

--VAR1 A

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

Логин шелл это то, что запускается после ввода пароля. Это указано в файлике /etc/passwd (после последнего двоеточия)

ziemin ★★
()
Ответ на: комментарий от teod0r
[elemashine@laptop ~]$ ./test1.sh 
123
OK
123
[elemashine@laptop ~]$ cat test1.sh 
#!/bin/bash
value="123"
echo $value
./test2.sh $value 
[elemashine@laptop ~]$ cat test2.sh 
#!/bin/bash
echo OK
echo $1
[elemashine@laptop ~]$ 
minakov ★★★★★
()
Ответ на: комментарий от ziemin

Логин шелл это то, что запускается после ввода пароля

а интерактивный как запускается? и чем они отличается?

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

Который запускается для выполнения скриптов. Не выводит приглашения командной строки и закрывается когда он закончится.

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

Логин шелл не обязательно оболочка, так что не обязательно интерактивный.

ziemin ★★
()

только первое слово (до пробела или таба)?

cut должен знать разделитель, для сабжа лучше: awk '{print $1}'

какой командой убрать первый символ?

те кто советует sed - недочитали ман по cut: cut -c2- (или в sh: ${var#?} )

брать только последнюю из них

тогда нежадные регэкспы (sed не умеет, можно perl / grep -P) или awk-ом брать последнее совпадение

чем отличается интерактивный шелл от логин шелла?

man bash в районе invocation (в основном смысле в том, чтобы экспортировать переменные среды перед запуском дочерних процессов)

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

aybcxbac z cxbzac /yez azac abzyc /ggedx cbbx

Это абракадабра. Где здесь x/y/z? Что это вообще значит?

DIRx=$(echo $ABRACADABRA | grep -o 'x/.*' | tail -1 | sed 's/x//')

И так для каждого x, y, z.

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

cut -c2-

спасибо. в мане про -c только:

select only these characters

или awk-ом брать последнее совпадение

не подскажешь какие ключи курить? в awk я ни в зуб ногой
как мне кажется, нужно брать слово, начинающееся с /, и брать с ним предыдущее слово, потом как-то из первого слова оставлять только нужные буквы. притом нужно делать чтоб если буква повторяется неск. раз с /dir, то нужно чтоб сначала всегда обраатывалось первое, т.е слева-направо, чтоб переменная перезаписалась на последнее правое значение.

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

DIRx=$(echo $ABRACADABRA | grep -o 'x/.*' | tail -1 | sed 's/x//')

$ DIRx=$(echo x ytyr xxyv ygygxyg /jybjyb xhyfvt /jyb | grep -o 'x/.*' | tail -1 | sed 's/x//')
$ echo $DIRx
_пусто

Где здесь x/y/z?

aybcxbac z cxbzac /yez azac abzyc /ggedx cbbx

Что это вообще значит?

это ключи у скрипта

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

это ключи у скрипта

может просто заменить «/» на "-" и использовать getopt? (или встроенный в bash getopts)

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

Ты работаешь в нечеловеческих условиях. Я тобой горжусь.

DIRx=$(echo x ytyr xxyv ygygxyg /jybjyb xhyfvt /jyb |grep -o 'x[^ ]* */[^ ]*' | tail -1 | sed 's/.*\///')

schizoid ★★★
()

Зачем так мучаться, попроси кого-нибудь из взрослых сделать за тебя.

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

wget http://example.org/page.html | grep -o 'http://kernel.org/...' | tail -1 | xargs wget

спс, но tail в конце не подходит:
linux-3.8.2.tar.bz2 03-Mar-2013 22:35 81M
linux-3.8.2.tar.gz 03-Mar-2013 22:35 102M
linux-3.8.2.tar.sign 03-Mar-2013 22:35 836
linux-3.8.2.tar.xz 03-Mar-2013 22:35 68M
linux-3.8.tar.bz2 19-Feb-2013 00:03 81M
linux-3.8.tar.gz 19-Feb-2013 00:03 102M
linux-3.8.tar.sign 19-Feb-2013 00:03 490
linux-3.8.tar.xz 19-Feb-2013 00:03 68M

teod0r ★★★★★
() автор топика

3. В ″man bash″ есть раздел ″INVOCATION″ там объяснено, что с точки зрения bash является login шелл и интерактивный shell.

А если в общем, то интерактивный шелл обычно подразумевает что с ним работает пользователь через терминал и этот шелл должен уметь работать с терминалом. Логин шелл обычно подразумевает, что он запущен процессом login или sshd и является лидером сеанса (session leader).

7. Что за программа генерит такой бред и что за другая программа, которая это бред парсит и что-то по нему делает?

И судя по тому, что я понял из объяснения алгоритма, здесь одними регулярными выражениями не обойтись, нужно из каждого слова выделять и запоминать ключи, а потом смотреть, есть ли для них /dir. Цикл вам нужно будет писать рукими, ИМХО, ЯП не так уж и важен.

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

schizoid
это помогло, спасибо

Что за программа генерит такой бред и что за другая программа, которая это бред парсит и что-то по нему делает?

это мой скрипт, который умеет принимать несколько ключей в любой последовательности (даже с пробелами) и опционально пути после некоторых из них. ключей всего 13, после 4х из них опционально могут идти пути.

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

wget не умеет перенаправление
U=http://www.kernel.org/pub/linux/kernel/;W=`wget $U -O vv;grep -o 'v.\../' vv|tail -1`;V=`wget $U$W -O vv;grep -Po 'linux-.\..(\..)*\.tar\.xz' vv|sort -V|tail -1`;wget $U$W$V

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

не понимаю, почему это:
cat ./script-1
#!/bin/bash
./script-2 F=fff
________________
cat ./script-2
#!/bin/bash
case $* in
*)
$*; echo $F;esac
_______________
не работает:
./script-1
./script-2 line 4: F=fff: command not found
почему
$*
говорит
F=fff: command not found?

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

сделал через:
VAR1=`echo $*|grep -o 'VAR1=[^ ]*'|cut -c6-`

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

ещё забыл:
8. как через скрипт сделать чтоб чрутнуться, выполнить команду и остаться в чруте?

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

5. А я вот понял, что имеет ввиду ziemin.

       -d, --delimiter=DELIM
              use DELIM instead of TAB for field delimiter

       -f, --fields=LIST
              select only these fields;  also print any line that contains no delimiter character, unless the -s option is specified
С помощью -d задаем делитель «полей», по умолчанию это таб. а параметром -f 1 указываем, что нам нужно только первое поле.

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

Скрипт не делает chroot cам (во всяком случае bash).

″cd″ это встроенная команда, bash преобразует её в syscall и выполняет сам и меняет свой рабочий каталог. ″chroot″ это внешняя команда, сам bash её не выполняет, свой корневой каталог bash не меняет. То есть всё что можно, это запустить через ″chroot″ другой bash-скрипт, который будет выполнятся другим интерпретатором. Скрипт не обязательно загонять в файл, можно сделать такой ужос:

echo 'for i in 1 2 3 ; do echo $i ; done ' | chroot /my-chroot /bin/bash

Но это будет другой (дочерний) процесс-скрипт со своими переменными.

Но портебность в chroot'е из bash-скрипта выглядит странновато, ИМХО, вы что-то не то делаете.

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

sh -с 'cmd; exec sh'

не понятно, как этим можно передать команду в чрут

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

echo 'for i in 1 2 3 ; do echo $i ; done ' | chroot /my-chroot /bin/bash

оно только выводит
1
2
3
и всё. чрут не выполняется

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

а ну может быть. я просто просил как сделать чтоб выполнить команды в чруте и после этого чтоб осталось чрутовое приглаение, как еси б запустил chroot /dir /bin/bash, выпонил команды и продожил работать в чруте

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

Если вам нужно, чтобы шелл выполнил какие-то команды, а потом стал работать в интерактивном режиме, то единственный путь, который я знаю это создание rc-файла. Причем не зависимо от того, долже ли быть этот шелл в chroot'е или нет. Для bash как-то так:

echo 'echo 123' > /my-chroot/tmp.bashrc.file
chroot /my-chroot /bin/bash --rcfile /tmp.bashrc.file

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

4) Ещё для того, чтобы выполняя команды с правами root'a не загубить систему.

какая тут связь с рутом? можно же от уже созданного юзера всё собрать. для чрута всё равно используется env -i. мне кажется создавать нового юзера - это лишнее

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

но ты же про рута написал,
и всё равно мне не понятно, как можно загубить систему, если делается env -i

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