Ketika saya menggunakan kode di bawah ini di terminal SSH untuk CentOS berfungsi dengan baik:
paste <(printf "%s\n" "TOP")
Tetapi jika saya menempatkan kode baris yang sama dalam skrip shell (test.sh) dan menjalankan skrip shell dari terminal, itu melempar kesalahan karena ini
./test.sh: line 30: syntax error near unexpected token ('
./test.sh: line 30: paste <(printf "%s\n" "TOP")
Bagaimana saya bisa memperbaiki masalah ini?
dash
alih-alihbash
).#!/bin/sh
di atas. Saya dieksekusi sebagaibash test.sh
tetapi tidak berhasil juga.bash
dalam mode POSIX tidak mendukung sintaks itu (ketika dipanggil dengan--posix
atau sebagai/bin/sh
). Gunakan#!/bin/bash
.POSIXLY_CORRECT
set variabel saat Anda mulaibash
?#!/bin/bash
di atas memperbaiki masalah.Jawaban:
Substitusi proses tidak ditentukan oleh POSIX, sehingga tidak semua POSIX shell mendukungnya, hanya beberapa kerang seperti
bash
,zsh
,ksh88
,ksh93
dukungan.Dalam
Centos
sistem,/bin/sh
adalah symlink ke/bin/bash
. Ketikabash
dipanggil dengan namash
,bash
masuk ke mode posix ( Bash Startup Files - Dipanggil dengan nama sh ). Dalam mode posix,process substitution
tidak didukung, menyebabkan kesalahan sintaksis.Script harus berfungsi, jika Anda menelepon
bash
langsungbash test.sh
. Jika tidak, mungkinbash
telah memasuki mode posix. Ini bisa terjadi jika Anda mulaibash
dengan--posix
argumen atau variabelPOSIXLY_CORRECT
diatur saatbash
mulai:Atau
bash
dibangun dengan--enable-strict-posix-default
opsi.Di sini, Anda tidak perlu proses substitusi, Anda dapat menggunakan pipa shell standar:
-
adalah cara standar untuk mengetahuipaste
membaca data dari stdin. Dengan beberapapaste
implementasi, Anda dapat menghilangkannya meskipun itu bukan standar.Di mana itu akan berguna adalah ketika menempelkan output lebih dari satu perintah seperti di:
Pada sistem yang mendukung
/dev/fd/n
, itu dapat dilakukansh
dengan:(itu yang
<(...)
dilakukan secara internal).sumber
Ini solusi lain. Alih-alih menjalankan perintah, jalankan bash dan teruskan perintah ke bash menggunakan -c:
sumber