Portál AbcLinuxu, 10. května 2025 11:48

Dotaz: Oprava příkazu

11.2.2016 13:07 JduJenKolem
Oprava příkazu
Přečteno: 226×
Odpovědět | Admin
Ahoj, poradte mi prosim proc mi tohle nyvyhodi chybu kdyz cesta neexistuje. Dekuji
for f in $(find "/pozadovana/cesta" -type f || exit 1);do . "$f" || exit 1; done
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Jendа avatar 11.2.2016 13:18 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Oprava příkazu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Mně to chybu vyhodí
~> for f in $(find "/pozadovana/cesta" -type f || exit 1);do . "$f" || exit 1; done
find: ‘/pozadovana/cesta’: No such file or directory
11.2.2016 13:41 JduJenKolem
Rozbalit Rozbalit vše Re: Oprava příkazu
Hm, u me zadna chyba, muzu mit neco vypnute nebo spatne nastaveno ? Dik
11.2.2016 13:57 JduJenKolem
Rozbalit Rozbalit vše Re: Oprava příkazu
Tak jsem zjistil, ze jdou chyby do nejakeho souboru 2>/logfile. Uz to funguje ale stale to nebere zretel na ten exit 1, i kdyz dir neexistuje script bezi dal, je to spatne napsane ? Dik
11.2.2016 15:47 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Oprava příkazu

V tom vnořeném příkazu nebude mít exit 1 žádný vliv, protože se z něj návratová hodnota nijak nepropaguje ven. Stačí se podívat na tohle:

for i in $(nonsense); do echo "$i"; done

Kupodivu to má návratovou hodnotu 0 (tedy úspěch), přestože nonsense neexistuje a nelze nic takového spustit (a normálně by shell vrátil hodnotu 127).

Ještě odbočím: Aby člověk rovnou na promptu viděl návratovou hodnotu posledního příkazu, je víc než rozumné přidat si do ~/.bashrc nebo ~/.bash_profile (nebo klidně do /etc/profile, pro mě za mě) něco takového:

PCOLOR_DEFAULT=$'\033[00m'
PCOLOR_RED=$'\033[01;31m'
PCOLOR_GREEN=$'\033[01;32m'
PCOLOR_YELLOW=$'\033[01;33m'
PCOLOR_BLUE=$'\033[01;34m'
PCOLOR_SHINY=$'\033[01;37m'
get_exit_status() {
  status="${?}"
  if [[ 0 -eq "${status}" ]]; then
    echo \
    'XCODE_COLOR="${PCOLOR_BLUE}"
    XCODE_STATUS='\'\'
  else
    echo \
    'XCODE_COLOR="${PCOLOR_RED}"
    XCODE_STATUS="['"${status}"']"'
  fi
}
PROMPT_COMMAND='eval $(get_exit_status)'
PS1='\[${XCODE_COLOR}\](\[${PCOLOR_BLUE}\]\u\[${PCOLOR_YELLOW}\]@\[${PCOLOR_SHINY}\]\h\[${PCOLOR_DEFAULT}\] \[${PCOLOR_GREEN}\]\W\[${XCODE_COLOR}\])${XCODE_STATUS}\$\[${PCOLOR_DEFAULT}\] '
Zpět k tématu: Nejblíž tomu, čeho jsi asi chtěl docílit, bude následující:
(
  set -e
  tmp="$(mktemp -d)"
  trap 'rm -Rf "$tmp"' EXIT
  mkfifo "$tmp"/pipe
  find "/požadovaná/cesta" -type f > "$tmp"/pipe &
  pid="$!"
  while read f; do . "$f"; done < "$tmp"/pipe
  wait "$pid"
)

Důvod, proč používám fifo a ne přímo pipe, je inlinování těch nalezených souborů do hlavního kontextu současného shellu. Kdyby while-cyklus četl názvy souborů ze shellové pipe, všechno, co ty inlinované soubory změní a nastaví, by po skončení pipeline nikde nezůstalo.

(Při použití pipeline se ovšem dají aspoň zjistit návratové hodnoty všech příkazů pipeline z bashového pole PIPESTATUS a vrátit třeba logický or mezi návratovými hodnotami nebo tak něco: status=0; for i in "${!PIPESTATUS[@]}"; do ((status |= PIPESTATUS[i])); done; exit "$status". Jakmile se používá `příkaz` nebo $(příkaz) jako argument for-cyklu, nic podobného není k dispozici.)

Výše uvedený skript okamžitě skončí s chybou, když find nemůže otevřít adresář pro hledání. Skončí taky s chybou po prvním nalezeném souboru, který se nepodaří nainlinovat (neplatný symlink, nejsou oprávnění atd. atp.). To by snad mohlo být ono.

11.2.2016 14:25 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Oprava příkazu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Asi bych to zjednodušil do tvaru
for f in "/pozadovana/cesta"/*; do
    . "$f"
done
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
11.2.2016 15:49 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Oprava příkazu

Tazatel ale neříká, že tam nemá podadresáře. Taky neříká, že by tam nesměly být soubory s názvem začínajícím tečkou.

11.2.2016 16:28 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Oprava příkazu
Jasně, zapomněl jsem se ho zeptat. Snad to tolik nevadí.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.