2016-10-26 3 views
0

я бег этого один лайнер, как часть большего script-паста не работают из сценария, но работает в командной строке

paste -d '' <(cut -c"1-5" file1) <(cut -c"1-2" file2) <(cut -c"8-" file1) 

Это занимает первые 5 символов первого файла file1, символы 1- 2 из file2, а затем символы 8 и далее от file1 и вставляют их все вместе.

$cat file1 
1234567890 
1234567890 
1234567890 
1234567890 
1234567890 

$cat file2 
abcdefghij 
abcdefghij 
abcdefghij 
abcdefghij 
abcdefghij 

output- 
12345ab890 
12345ab890 
12345ab890 
12345ab890 
12345ab890 

Это работает отлично, как ожидалось, из командной строки (выход показан выше).

Однако, если я поставлю эту строку в скрипт (здесь) -

$cat a.sh 

#!/bin/bash 
paste -d '' <(cut -c"1-5" a) <(cut -c"1-2" b) <(cut -c"8-" a) 

Если я запускаю сценарий, я получаю это error-

$sh a.sh 
a.sh: line 2: syntax error near unexpected token `(' 
a.sh: line 2: `paste -d '' <(cut -c"1-5" a) <(cut -c"1-2" b) <(cut -c"8-" a)' 

Любые идеи, что происходит здесь не так? Я провел его через shellcheck, и он сказал мне, что сценарий в порядке.

+3

Вы запускаете свой скрипт с помощью 'sh', а' sh' не знает о подстановке процесса (синтаксис '<()'). Запустите его с помощью 'bash a.sh' или сделайте его исполняемым (' chmod + x a.sh') и запустите его с помощью './A.sh'. Кроме того, первая строка 'a.sh' не должна быть пустой, или строка shebang (' #!/Bin/bash') может быть проигнорирована. –

+1

Как в стороне, ваше описание прозы не согласуется с кодом вообще. Например, если у вас есть 'cut -c1-2', в вашем описании говорится, что вам нужны символы 3-10. – tripleee

+0

@ tripleee, вот что я получаю для первого использования реального примера из моей работы, а затем для упрощения вопроса. Спасибо за головы! – VM17

ответ

1

работать как указано ниже;

./a.sh 

или

bash a.sh 

Баш и ш две разные оболочки. bash имеет больше возможностей и лучший синтаксис.