Linux: Como passar um conteúdo de arquivo como um argumento para um comando?

0

este é o conteúdo do arquivo packageList :

base-files
busybox
dnsmasq
dropbear
firewall
hotplug2
iptables
iptables-mod-conntrack-extra
iptables-mod-filter
iptables-mod-ipopt
iw
jshn
kernel
kmod-ath
kmod-ath9k
kmod-ath9k-common
kmod-cfg80211
kmod-crypto-aes
kmod-crypto-arc4
kmod-crypto-core
kmod-gpio-button-hotplug
kmod-ifb
kmod-ipt-conntrack
kmod-ipt-conntrack-extra
kmod-ipt-core
kmod-ipt-filter
kmod-ipt-ipopt
kmod-ipt-nat
kmod-ipt-nathelper
kmod-leds-gpio
kmod-ledtrig-default-on
kmod-ledtrig-netdev
kmod-ledtrig-timer
kmod-lib-crc-ccitt
kmod-lib-textsearch
kmod-mac80211
kmod-nls-base
kmod-ppp
kmod-pppoe
kmod-pppox
kmod-sched-connmark
kmod-sched-core
kmod-tun
kmod-wdt-ath79
libblobmsg-json
libc
libgcc
libip4tc
libip6tc
libiwinfo
libiwinfo-lua
libjson
liblua
liblzo
libnfnetlink
libnl-tiny
libopenssl
libubox
libubus
libubus-lua
libuci
libuci-lua
libxtables
lua
luci
luci-app-firewall
luci-app-qos
luci-app-tinyproxy
luci-app-upnp
luci-i18n-english
luci-lib-core
luci-lib-ipkg
luci-lib-nixio
luci-lib-sys
luci-lib-web
luci-mod-admin-core
luci-mod-admin-full
luci-proto-core
luci-proto-ppp
luci-proto-relay
luci-sgi-cgi
luci-theme-base
luci-theme-openwrt
miniupnpd
mtd
netifd
openvpn
opkg
ppp
ppp-mod-pppoe
qos-scripts
relayd
swconfig
tc
tinyproxy
uboot-envtools
ubus
ubusd
uci
uhttpd
wpad-mini
zlib

agora eu gostaria de passá-lo como argumento para:

make image PROFILE = PACKAGES TLWR740 = packageList

isso é BASH, como vai fazer isso? o conteúdo deve ser passado como argumento desta forma:

arquivos-base busybox dnsmasq dropbear firewall hotplug2 iptables iptables-mod-conntrack-extra iptables-mod-filter iptables-mod-ipopt iw kernel jshn kmod-ath kmod-ath9k km-ath9k-comum kmod-cfg80211 kmod-crypto- aes kmod-crypto-arc4 kmod-crypto-core kmod-gpio-button-hotplug kmod-ifb kmod-ipt-conntrack kmod-ipt-conntrack-extra km-ipt-core kmod-ipt-filtro kmod ipt ipod-kmop- ipt-nat od km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km km kmod-ppp kmod-pppoe kmod-pppox kmod-sched-connmark kmod-sched-core kmod-tun kmod-wdt-ath79 libblobmsg-j libc libg libn libl libs libl lua lucuci-lua libxtables lua luci luci-app-firewall luci-app-qos luci-app-minúsculoproxy luci-app-upnp luci-i18n-inglês luci-lib-core luci-lib-ipkg luci-lib-nixio luci lib-sys luci-lib-web luci-mod-admin luci-mod-admin-completo luci-proto-core luci-proto-ppp luci-proto-relé luci-sgi-cgi luci-tema-base luci-tema-openwrt miniupnpd mtd netifd openvpn opclo ppp ppp-mod-pppoe qos-scripts relayd swconfig tc tinyproxy uboot-envtools ubus ubusd uci uhttpd wpad-mini zlib

    
por FernandoSBS 16.11.2013 / 15:11

5 respostas

3

Você pode fazer assim:

  1. Declare a variável $packages como array
  2. Leia o conteúdo do arquivo packageList em $packages
  3. Execute o make com todos os elementos da matriz como lista ( ${packages[*]} )

Portanto, esse snippet deve funcionar:

declare -a packages
packages=($(< packageList))
make image PROFILE=TLWR740 PACKAGES="${packages[*]}"

Um comentário é apropriado sobre ${packageList[*]} . Isso se expande para todos os elementos da matriz como uma palavra da shell . Isso é semelhante se você escrever "one two three" (observe as aspas) na linha de comando.

Um exemplo simples, usando uma função first , que imprime seu primeiro argumento :

$ function first { echo $1 ; }
$ first one two three
one
$ first "one two three"
one two three

Agora, com uma matriz:

$ foo=(one two three)
$ first "${foo[@]}"
one
$ first "${foo[*]}"
one two three

Portanto, com @ , o shell divide o array em várias palavras shell, usando * , não.

    
por 16.11.2013 / 21:44
1

Use tr para converter os caracteres de nova linha em espaços:

make image PROFILE=TLWR740 "PACKAGES=$( tr '\n' ' ' < packageList)"

Parece que tr apenas lê stdin, por isso modifiquei meu comando acima para passar o arquivo via stdin.

    
por 16.11.2013 / 20:51
1
make image PROFILE=TLWR740 PACKAGES="'cat packageList | tr '\n' ' ''"

Isso deve ser feito. cat imprime o conteúdo do arquivo e o comando tr substitui as novas linhas por espaços. (Nota: isso assume que packageList é um arquivo no diretório atual, se estiver em outro lugar, será necessário substituir o nome para incluir o caminho correto ou usar uma variável para referenciá-lo)

    
por 16.11.2013 / 22:40
1

Use o comando xargs .

Para passar os nomes dos arquivos de um arquivo para um comando cp , podemos fazer:

cat 'file_name'| args -I % cp % destination_directory

Mas se você quiser ver como seria ecoar:

cat 'file_name' | args -I % echo cp % destination_directory 

Isso só vai ecoar.

    
por 02.05.2015 / 07:31
0
List='cat packageList'  
make image PROFILE=TLWR740 PACKAGES="$List"  

cat escreve o conteúdo do arquivo. (experimente em cli.)

    
por 16.11.2013 / 15:16