LINUX.ORG.RU

Команда call не работает с функциями если sh не bash

 , csvtool,


0

1

Делаю как в help-е:

echo how,now > my.csv
echo brown,cow >> my.csv
function myfunc { echo Column 1: $1; echo Column 2: $2; }
export -f myfunc
csvtool call myfunc my.csv
Результат:
sh: myfunc: not found
myfunc: terminated with exit code 127
csvtool запускает sh вместо bash, а в Debian sh это dash в котором нет экспорта функций.

Делать sh ссылкой на bash из-за одного csvtool не хочется.

Можно ли как-нибуть заставить csvtool запускать bash вместо sh?

★★★

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

может просто сделать myfunc не функцией, а отдельным скриптом?

val-amart ★★★★★
()

Делать sh ссылкой на bash из-за одного csvtool не хочется.

просто начни с команды bash, а потом делай тоже самое.

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

просто начни с команды bash

Это как? Я пробовал так:

csvtool call 'exec bash -c myfunc' my.csv
Не помогает, что логично.

val-amart > сделать myfunc не функцией, а отдельным скриптом?

Так и сделал пока. Но это не красиво, в нём три строчки всего.

Покапался в исходниках, нашёл почему запускается sh, а не bash. Вот тут вызывается функция system, которая запускает /bin/sh -c.

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

Это как?

вот так:

$ bash
$ $0 --version
GNU bash, version 4.2.37(2)-release (i486-slackware-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Если ты хочешь скрипт, то начни его так:
#!/bin/bash
тогда этот скрипт будет выполнен НЕ /bin/sh, а /bin/bash.

Надоел баш? Вот:

$ csh
% $0 --version
tcsh 6.18.01 (Astron) 2012-02-14 (i686-intel-linux) options wide,nls,dl,al,kan,rh,filec
% 

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

Покапался в исходниках, нашёл почему запускается sh, а не bash. Вот тут вызывается функция system, которая запускает /bin/sh -c.

ну значит не судьба.

drBatty ★★
()

function myfunc { echo Column 1: $1; echo Column 2: $2; }

function — башизм, не пиши его. Попробуй myfunc() {echo ...}

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

x3al, простой POSIX shell не умеет некоторых вещей.
Как в нём, например, прочитать строки разделённые null-символами?
Вот такой bash код:

read -d $'\0' x < <(printf 'a\0')
как записать в POSIX shell-е?

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

Так и сделал пока. Но это не красиво, в нём три строчки всего.

Покапался в исходниках, нашёл почему запускается sh, а не bash. Вот тут вызывается функция system, которая запускает /bin/sh -c.

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

val-amart ★★★★★
()
Ответ на: комментарий от LinuxUser

Как в нём, например, прочитать строки разделённые null-символами?

тебе обязательно читать их функцией read?

drBatty ★★
()

Если очень нужно

>cat 1.sh 
#! /bin/bash

function myfunc { echo Column 1: $1; echo Column 2: $2; }
export -f myfunc

./call

>cat call 
#! /bin/sh

eval "myfunc $myfunc"
myfunc
Результат выполнения
>./1.sh 
Column 1:
Column 2:
Но так делать не стоит, проще поменять шел

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

тебе обязательно читать их функцией read?

Из stdin приходят значения разделённые null-символами.
Стоит задача присвоить эти значения разным переменным,
чтоб их потом другой скрипт, вызываемый так

. ./script
мог использовать.

LinuxUser ★★★
() автор топика
Ответ на: комментарий от Skolotovich
#!/bin/sh

printf 'a\0b\0\n' |
while read -r -d '' line; do
        echo $line
done

А какой шел использовать? dash, который в Debian по умолчанию и который conform with the POSIX 1003.2 and 1003.2a specifications for the shell, -d у read не понимает:

neo@nvh:/tmp$ dash script 
read: 6: Illegal option -d

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

Из stdin приходят значения разделённые null-символами.
Стоит задача присвоить эти значения разным переменным, чтоб их потом другой скрипт, вызываемый так

и конечно xargs -0 тебе не подходит?

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

Мне нужен именно bash. Простой POSIX shell не умеет, например, read -d $'\0'.

Не правда. На самом деле тебе нужен perl или python.

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

А a и b надо записать в разные переменные.

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

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

простой POSIX shell не умеет некоторых вещей.

Как в нём, например, прочитать строки разделённые null-символами?

man sed

man tr

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

А какой шел использовать?

пробуй bash, с dash уменя много чего не получалось сделать ):

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