summaryrefslogtreecommitdiffstats
path: root/examples/misc/cshtobash
blob: ce49bfc9f0b1df8f280d95938cf7a6a78434331e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#! /bin/bash
#
# cshtobash - convert csh aliases, environment variables, and variables to
#	      bash equivalents
#
# usage: cshtobash [filename]
#
# If filename is given, that file is sourced.  Note that csh always
# sources .cshrc.  To recreate your csh login environment, run
# `cshtobash ~/.login'.
#
# Inspired by (and some borrowed from) a similar program distributed with
# zsh-3.0.
#
# Chet Ramey
# chet@po.cwru.edu
#
trap 'rm -f $TMPFILE1 $TMPFILEa $TMPFILEe $TMPFILEv $TMPFILEco $TMPFILEci' 0 1 2 3 6 15

{ TMPFILE1=$(mktemp -t cb.1.XXXXXX) &&
  TMPFILEa=$(mktemp -t cb.a.XXXXXX) &&
  TMPFILEe=$(mktemp -t cb.e.XXXXXX) &&
  TMPFILEv=$(mktemp -t cb.v.XXXXXX) &&
  TMPFILEco=$(mktemp -t cshout.XXXXXX) &&
  TMPFILEci=$(mktemp -t cshin.XXXXXX)
} || exit 1


T=$'\t'

SOURCE="${1:+source $1}"

cat << EOF >$TMPFILEci
$SOURCE
alias >! $TMPFILEa
setenv >! $TMPFILEe
set >! $TMPFILEv
EOF

# give csh a minimal environment, similar to what login would provide
/usr/bin/env - USER=$USER HOME=$HOME PATH=/usr/bin:/bin:/usr/ucb:. TERM=$TERM SHELL=$SHELL /bin/csh -i < $TMPFILEci > $TMPFILEco 2>&1

# First convert aliases

cat << \EOF >$TMPFILE1
mkalias ()
{
	case $2 in
	'')	echo alias ${1}="''" ;;
	*[#\!]*)
		comm=$(echo $2 | sed  's/\!\*/"$\@"/g
				       s/\!:\([1-9]\)/"$\1"/g
			               s/#/\#/g')
		echo $1 \(\) "{" command "$comm"  "; }"
		;;
	*)	echo alias ${1}=\'$(echo "${2}" | sed "s:':'\\\\'':")\' ;;
	esac
}
EOF

sed "s/^\([a-zA-Z0-9_]*\)$T\(.*\)$/mkalias \1 '\2'/" < $TMPFILEa >>$TMPFILE1

echo '# csh aliases'
echo

$BASH $TMPFILE1 | sed -e 's/\$cwd/\$PWD/g' \
		   -e 's/\$term/\$TERM/g' \
		   -e 's/\$home/\$HOME/g' \
		   -e 's/\$user/\$USER/g' \
		   -e 's/\$prompt/\$PS1/g'

# Next, convert environment variables
echo
echo '# csh environment variables'
echo

# Would be nice to deal with embedded newlines, e.g. in TERMCAP, but ...
sed -e '/^SHLVL/d' \
    -e '/^PWD/d' \
    -e "s/'/'"\\\\"''"/g \
    -e "s/^\([A-Za-z0-9_]*=\)/export \1'/" \
    -e "s/$/'/" < $TMPFILEe

# Finally, convert local variables
echo
echo '# csh variables'
echo

sed -e 's/'"$T"'/=/' \
    -e "s/'/'"\\\\"''"/g \
    -e '/^[A-Za-z0-9_]*=[^(]/{
	s/=/='"'/"'
	s/$/'"'/"'
	}' < $TMPFILEv |
sed -e '/^argv=/d' -e '/^cwd=/d' -e '/^filec=/d' -e '/^status=/d' \
	 -e '/^verbose=/d' \
	 -e '/^term=/d' \
	 -e '/^home=/d' \
	 -e '/^path=/d' \
	 -e '/^user=/d' \
	 -e '/^shell=/d' \
	 -e '/^cdpath=/d' \
	 -e '/^mail=/d' \
	 -e '/^home=/s//HOME=/' \
	 -e '/^prompt=/s//PS1=/' \
	 -e '/^histfile=/s//HISTFILE=/' \
	 -e '/^history=/s//HISTSIZE=/' \
	 -e '/^savehist=$/s//HISTFILESIZE=${HISTSIZE-500}/' \
	 -e '/^savehist=/s//HISTFILESIZE=/' \
	 -e '/^ignoreeof=$/s/^.*$/set -o ignoreeof # ignoreeof/' \
	 -e '/^ignoreeof=/s//IGNOREEOF=/' \
	 -e '/^noclobber=/s/^.*$/set -C # noclobber/' \
	 -e '/^notify=/s/^.*$/set -b # notify/' \
	 -e '/^noglob=/s/^.*$/set -f # noglob/' \


# now some special csh variables converted to bash equivalents
echo
echo '# special csh variables converted to bash equivalents'
echo

sed -e 's/'"$T"'/=/' < $TMPFILEv |
grep "^cdpath=" |
sed 's/(//
     s/ /:/g
     s/)//
     s/cdpath=/CDPATH=/'


sed -e 's/'"$T"'/=/' < $TMPFILEv |
grep "^mail=" |
sed 's/(//
     s/ /:/g
     s/)//
     s/mail=/MAILPATH=/' |
sed -e 's/MAILPATH=\([0-9][0-9][^:]*\)$/MAILCHECK=\1/' \
    -e 's/MAILPATH=\([0-9][0-9][^:]*\):\(.*\)/MAILCHECK=\1 MAILPATH=\2/'

exit 0