Saya telah mencoba berbagai bentuk berikut dalam skrip bash:
#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Tetapi saya tidak bisa mendapatkan sintaks untuk memperluas COLUMNS
variabel lingkungan dengan benar .
Saya sudah mencoba berbagai bentuk berikut ini:
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'
dan
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'
dan
eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Saran?
bash
quotes
environment
Jamie
sumber
sumber
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W ""$COLUMNS"
$@
kutip membuatnya persis sama dengan$*
- artinya ia memecah"foo bar"
menjadi dua argumen terpisah,foo
danbar
. Jika Anda ingin mempertahankan daftar argumen asli seperti yang diberikan kepada Anda, Anda menginginkannya"$@"
.Jawaban:
Jika tidak yakin, Anda dapat menggunakan permintaan 'cols' di terminal, dan lupa KOLOM:
sumber
Sekadar catatan / ringkasan singkat untuk siapa saja yang datang ke sini melalui Google mencari jawaban atas pertanyaan umum yang ditanyakan dalam judul (seperti saya). Salah satu dari berikut ini seharusnya berfungsi untuk mendapatkan akses ke variabel shell di dalam tanda kutip:
echo "$VARIABLE" echo "${VARIABLE}"
Penggunaan tanda kutip tunggal adalah masalah utama. Menurut Manual Referensi Bash :
Dalam kasus khusus yang ditanyakan dalam pertanyaan, $ COLUMNS adalah variabel khusus yang memiliki properti tidak standar (lihat jawaban lhunath di atas).
sumber
'before'"$variable"'after'
(seperti yang dinyatakan dalam jawaban ini: stackoverflow.com/a/13802438/2254346 )Perhatikan bahwa
COLUMNS
:SIGWINCH
sinyal.Poin kedua itu biasanya berarti bahwa
COLUMNS
variabel Anda hanya akan disetel di shell interaktif Anda , bukan di skrip bash.Jika skrip Anda
stdin
terhubung ke terminal Anda, Anda dapat secara manual mencari lebar terminal Anda dengan menanyakan terminal Anda:Dan untuk menggunakan ini dalam perintah SVN Anda:
svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"
(Catatan: Anda harus mengutip
"$@"
dan menjauh darieval
;-))sumber
Skrip berikut berfungsi untuk saya untuk beberapa nilai
$COLUMNS
. Saya ingin tahu apakah Anda tidak mengaturCOLUMNS
sebelum panggilan ini?#!/bin/bash COLUMNS=30 svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Dapatkah Anda menggemakan
$COLUMNS
di dalam skrip Anda untuk melihat apakah itu disetel dengan benar?sumber
$@
- yang membagi satu parameter"two words"
menjadi dua parameter terpisah,two
danwords
. Harus"$@"
melewati daftar argumen persis seperti yang diberikan.Anda melakukannya dengan benar, jadi saya rasa ada hal lain yang salah (bukan mengekspor KOLOM?).
Trik untuk men-debug kasus ini adalah dengan membuat perintah khusus (penutupan untuk orang bahasa pemrograman). Buat skrip shell bernama diff-kolom melakukan:
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
dan gunakan saja
svn diff "$@" --diff-cmd diff-columns
Dengan cara ini kode Anda lebih bersih untuk dibaca dan lebih modular (pendekatan top-down), dan Anda dapat menguji kode kolom-diff secara terpisah (pendekatan bottom-up).
sumber